第十四章、构建自己的同步工具
1.条件谓词概念:
2.依赖于条件谓词的状态来决定执行或者休眠,可以使用condition:即Condition.await()和Condition.signal()方法
在使用await和notify之前要先加锁,再进行await()或者notify(),在每次调用await方法的时候,就会进入该Condition的等待队列(默认公平队列),直到signal方法唤醒,具体原理见帖子:
http://www.jianshu.com/p/be2dc7c878dc
3.Thread.sleep(long time)和wait()的区别:Thread.sleep是持有锁休眠,而wait进入休眠的时候会释放锁。
4.有时候线程被唤醒的时间不是时候(或者是错过了某次的唤醒),还要继续检测条件谓词。应该在循环内部调用wait:
synchronized(lock){ while(!conditionPredicate()){ lock.wait(); } }
5.优先使用notifyAll()而不是notify(),这样能确保操作是正确的,尽管在性能上会有所降低。
6.一个依赖于状态的类,要么完全将他的等待和通知协议暴露(并文档化)给子类,要么完全阻止子类参与其中。
7.理解ReentrantLock,Semaphore,CountDownLatch,FutureTask,ReentrantLockReadWriteLock