题目:两个线程,其中一个线程完成对某个对象的int值++操作,另一个线程对该对象的int类型--操作,同时要保证该对象的值不会小于0,不会大于1,该值初始化值为0.
结果为 01010101010101010101……
package com.test;
public class ThreadTest {
private int number = 0;
public synchronized void jia() throws InterruptedException {
if (number != 0) {
wait();
}
number++;
System.out.println("jia:"+number);
notify();
}
public synchronized void jian() throws InterruptedException {
if (number == 0) {
wait();
}
number--;
System.out.println("jian:"+number);
notify();
}
public static void main(String[] args) {
ThreadTest tt = new ThreadTest();
Producer p = new Producer(tt);
Consumer c = new Consumer(tt);
p.start();
c.start();
}
}
class Producer extends Thread{
ThreadTest tt;
public Producer(ThreadTest tt) {
this.tt=tt;
}
@Override
public void run() {
while(true){
try {
tt.jia();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer extends Thread{
ThreadTest tt;
public Consumer(ThreadTest tt) {
this.tt=tt;
}
@Override
public void run() {
while(true){
try {
tt.jian();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出结果为
jian:0
jia:1
jian:0
jia:1
jian:0
jia:1
jian:0
jia:1
jian:0
加启动两个线程,减启动两个线程?
private int number = 0;
public synchronized void jia() throws InterruptedException {
while (number != 0) {
wait();
}
number++;
System.out.println(Thread.currentThread().getName()+ " jia:"+number);
notify();;
}
public synchronized void jian() throws InterruptedException {
while (number == 0) {
wait();
}
number--;
System.out.println(Thread.currentThread().getName()+ " jian:"+number);
notify();
}
改成while的话有可能会造成死锁,解决办法为把notify改为notifyAll方法调用。
关于wait,notify,notifyAll以及sleep方法的关系(重点)
(1,如果一个线程调用了某个对象的wait方法,那么该线程首先必须要拥有该对象的锁。(一个线程调用了某个对象的wait方法,那么该wait必须在synchronized中)
(2,如果一个线程调用了某个对象的wait方法,那么该线程就会释放该对象的锁。
(3,在java对象中,有两种池(锁池,等待池)
(4,如果一个线程调用了某个对象的wait方法,那么该线程进入该对象的等待池中(释放锁)如果未来某一时刻,另外一个线程调用了该对象的notify或者notifyAll方法,那么在该等待池中的等待的线程就会进入该对象的锁池中,去等待该对象的锁,如果或得锁成功后,那么该线程将继续沿着wait方法之后的路径去执行。
(5,sleep 睡眠,不释放锁