併發工具優於wati、notify(69)

如今幾乎沒有理由在使用wait 和 notify,使用高級工具代替java

java.util.concurrent 包併發工具分三類:編程

  • Executor 框架
  • 併發集合(concurrent Collection)
  • 同步器(synchronizer)

併發集合多線程

  • 對標準集合接口(List、Map、Queue)封裝了高性能的併發實現
  • 爲了提升併發性,實現了內部管理同步
  • 除非不得已,請優先使用ConcurrentHashMap
    • 相較於普通 Map ,極大提高了性能

String#intern方法中看到,併發

  • 這個方法是一個 native 的方法,但註釋寫的很是明瞭。
  • 「若是常量池中存在當前字符串, 就會直接返回當前字符串.
    • 若是常量池中沒有此字符串, 會將此字符串放入常量池中後, 再返回」。

阻塞操做(BlockingQueue)::框架

  • 一直阻塞直到被成功執行爲止
  • take 方法刪除並返回頭元素,隊列爲空就等待
  • 大部分 ExecutorService 都是用Blockingqueue

同步器(Synchronizer)::高併發

  • 使一個線程可以等待另外一個線程,容許他們協調動做
  • 經常使用同步器有semaphore、CountDownLatch
  • 不經常使用的有CyclicBarrier、ExChanger

倒計數鎖存器(CountDownLatch)::工具

System.nanoTime()性能

  • 精度更高
  • 優先使用他,而不是currentTimeMillis
  • 用於計算時間差

使用wait測試

  • 始終應該使用循環模式來調用wait
  • 永遠不要在循環外調用wait
  • 循環會在等待以前和以後調用測試條件
    • (!!!這個很重要,這就是這裏 while 不能換成if的緣由)

在多線程的編程實踐中,wait()的使用方法以下:線程

  • 循環裏面就一個wait 語句,別的事都不作
synchronized (monitor) {
    //  判斷條件謂詞是否獲得知足
    while(!locked) {
        //  等待喚醒
        monitor.wait();
    }
    //  處理其餘的業務邏輯
}

那爲何非要while判斷,而不採用if判斷呢?以下:

synchronized (monitor) {
    //  判斷條件謂詞是否獲得知足
    if(!locked) {
        //  等待喚醒
        monitor.wait();
    }
    //  處理其餘的業務邏輯
}
相關文章
相關標籤/搜索