public class SpuriousWakeUpTest {
private final Object lock = new Object();
private int product = 0;
private void produce() {
synchronized (lock) {
product = product + 1;
lock.notify();
}
}
private void consume() {
synchronized (lock) {
if (product <= 0) {
try {
lock.wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
product = product - 1;
if (product < 0) {
System.err.println(Thread.currentThread().getName() + " spurious lock happend, product: " + product);
}
}
}
//如果没有产品,在lock对象上等待唤醒,如果有产品,消费.
private Runnable consumer = () -> {
while(true) {
consume();
}
};
//生产一个产品然后唤醒一个在lock对象上等待的consumer
private Runnable producer = () -> {
while(true) {
produce();
}
};
public void start() {
// 启动2个consumer,1个producer
Thread c1 = new Thread(consumer);
Thread c2 = new Thread(consumer);
Thread p = new Thread(producer);
c1.start();
c2.start();
p.start();
}
public static void main(String[] args) {
SpuriousWakeUpTest s = new SpuriousWakeUpTest();
s.start();
}
}
出现很多负数