Java多线程可以通过synchronzied与wait()和notify()/notifyAll()方法相结合可以实现等待/通知模式。
通过显式Lock和Condition也可以实现等待/通知模式。
因为在使用notify()/notifyAll()方法进行通知时,被通知的线程是由JVM随机选择的。但是通过Lock和Condition可以选择性的通知,更灵活。
在condition.await()方法调用之前需要调用lock.lock()代码获得同步锁。要不然报错
一个Condition对象实现等待/通知模式
Object类中的wait()方法等同于Condition类中的await()方法
Object类中的wait(long timeout)方法等同于Condition类中的await(long time,TimeUnit unit)方法
Object类中的notify()方法等同于Condition类中的signal()方法
Object类中的notifyAll()方法等同于Condition类中的signalAll()方法
多个Condition对象实现等待/通知模式
这个时候创建了两个Condition对象A和B,但是我只通知了A,所以awaitB()方法在打印完awaitB:开始之后进入阻塞模式。
synchronized相当于整个Lock对象只有一个单一的Condition对象,所有线程都注册在它一个对象上面。所以线程开始notifyAll()的时候会通知所有的waiting线程,没有选择权,会出现效率问题。