先解释什么是虚假唤醒
当使用notify、notifyAll、signal、signalAll等方法时,唤醒了并非想要运行的线程。
因为这些方法不知道具体是唤醒的哪个线程,notify和signal唤醒一个线程,notifyAll和signalAll会唤醒所有对应的正在等待的线程,但是并非所有都是需要唤醒的,这个就是所谓的虚假唤醒。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
public static void main(String[] args) {
Resource r = new Resource();
new Thread(new Producer(r)).start();
new Thread(new Producer(r)).start();
new Thread(new Consumer(r)).start();
new Thread(new Consumer(r)).start();
}
}
class Resource {
private String name;
private int count = 1;
private boolean flag;
private Lock lock = new ReentrantLock();
private Condition pro_condition = lock.newCondition();
private Condition con_condition = lock