如今幾乎沒有理由在使用wait 和 notify,使用高級工具代替java
java.util.concurrent 包併發工具分三類:編程
- Executor 框架
- 併發集合(concurrent Collection)
- 同步器(synchronizer)
併發集合多線程
- 對標準集合接口(List、Map、Queue)封裝了高性能的併發實現
- 爲了提升併發性,實現了內部管理同步
- 除非不得已,請優先使用ConcurrentHashMap
String#intern
方法中看到,併發
- 這個方法是一個 native 的方法,但註釋寫的很是明瞭。
- 「若是常量池中存在當前字符串, 就會直接返回當前字符串.
- 若是常量池中沒有此字符串, 會將此字符串放入常量池中後, 再返回」。
阻塞操做(BlockingQueue)::框架
- 一直阻塞直到被成功執行爲止
- take 方法刪除並返回頭元素,隊列爲空就等待
- 大部分 ExecutorService 都是用Blockingqueue
同步器(Synchronizer)::高併發
- 使一個線程可以等待另外一個線程,容許他們協調動做
- 經常使用同步器有semaphore、CountDownLatch
- 不經常使用的有CyclicBarrier、ExChanger
倒計數鎖存器(CountDownLatch)::工具
System.nanoTime()性能
- 精度更高
- 優先使用他,而不是currentTimeMillis
- 用於計算時間差
使用wait測試
- 始終應該使用循環模式來調用wait
- 永遠不要在循環外調用wait
- 循環會在等待以前和以後調用測試條件
- (!!!這個很重要,這就是這裏 while 不能換成if的緣由)


在多線程的編程實踐中,wait()的使用方法以下:線程
synchronized (monitor) {
// 判斷條件謂詞是否獲得知足
while(!locked) {
// 等待喚醒
monitor.wait();
}
// 處理其餘的業務邏輯
}
那爲何非要while判斷,而不採用if判斷呢?以下:
synchronized (monitor) {
// 判斷條件謂詞是否獲得知足
if(!locked) {
// 等待喚醒
monitor.wait();
}
// 處理其餘的業務邏輯
}