class MyResource {
private int product;
public synchronized void produce() {
if (product > 10) {
System.out.println(Thread.currentThread().getName() + " 即将等待 product 已满 " + product);
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 被唤醒 product 已满 " + product);
}
product++;
System.out.println(Thread.currentThread().getName() + " 进货成功 " + product);
// 每次都唤醒一下???
notify();
}
public synchronized void consume() {
if (product <= 0) {
// while(product<=0){
System.out.println(Thread.currentThread().getName() + " 即将等待 product 已空 " + product);
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 被唤醒product " + product);
}
product--;
System.out.println(Thread.currentThread().getName() + "售货成功 " + product);
// 每次都唤醒一下???
notify();
}
}
public class FalseAwakeningExample {
public static void main(String[] args) throws InterruptedException {
MyResource resource = new MyResource();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.produce();
}
}, "生产者1").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.produce();
}
}, "生产者2").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
resource.consume();
}
}, "消费者1").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
resource.consume();
}
}, "消费者2").start();
}
}
说明:4个线程(2个消费者2个生产者)共同操作一个资源类,因为都要获取同一把锁,所以任何一时刻只有一个线程在运行.
原因:生产者 消费者 锁的是同一个对象 生产者连续获得锁 生产者相互唤醒 过程: