七周七并發(fā)模型-讀書筆記-線程與鎖

目錄

  • 概述
  • 線程與鎖
  • 函數式編程
  • Clojure之道-分離標識與狀態(tài)
  • Actor
  • 通信順序進程
  • 數據并行
  • Lambda 架構
  • 結束

概述

  • 并發(fā) VS 并行
  • 并行架構
  • 并發(fā):不只是多核
  • 七個模型

線程與鎖

Day 1 - 互斥與內存模型

  1. 學習:如何創(chuàng)建線程;Java 對象內置鎖實現(xiàn)互斥;線程與鎖模型的三個主要危害:競態(tài)條件、死鎖、內存可見性;

  2. 線程與鎖模型,在不同編程語言中普遍適用的原理:

  • 對共享變量的所有訪問都需要同步化
  • 讀線程和寫線程都需要同步化
  • 按照約定的全局順序來獲得多把鎖(對象的散列值)
  • 當持有鎖時避免調用外星方法
  • 持有鎖的時間盡可能短

Day 2 - 超越內置鎖

  1. 內置鎖的限制:
  • 一個線程等待內置鎖進入阻塞之后,無法中斷線程
  • 嘗試獲取內置鎖時,無法設置超時
  • 獲得內置鎖,必須使用 Synchronized 塊
  1. ReentrankLock 提供顯式的Lock 與 Unlock 方法,可解決上述限制。
Lock lock = new ReentrankLock();
lock.lock();
try{
    //...
}finally{
    lock.unlock();
}
  1. 可中斷的鎖-ReentrankLock.lockInterruptibly()

  2. 超時-ReentrankLock.tryLock() -> 活鎖現(xiàn)象影響(所有死鎖線程同時超時,極有可能重現(xiàn)陷入死鎖)

  3. 交替鎖(hand-over-hand locking)

  4. 條件變量 ReentrankLock.newCondition()

  5. 原子變量 java.util.concurrent.atomic, 無鎖非阻塞

學習:java.util.concurrent.lock; java.util.concurrent.atomic;

Day 3 - 站在巨人肩上

Java.util.concurrent;

  1. 創(chuàng)建線程終極版-使用線程池

  2. 寫入時復制, copyOnWriteArrayList 監(jiān)聽器更高效

  3. 線程池應該多大:CPU 密集型,線程池大小接近核數;IO 密集型,線程池可以更大一些。最佳方式是真實環(huán)境壓測來衡量性能。

  4. 詞頻統(tǒng)計

    java.util.concurrent.ArrayBlockingQueue 實現(xiàn)生產者與觀察者直接的高效協(xié)作; java.util.concurrent.ConcurrentHashMap 更高效的并發(fā);

總結

線程與鎖模型優(yōu)點是適用面很廣,更接近本質,易于指令式、面向對象語言中實現(xiàn);缺點沒有為并行提供直接支持,不適用于分布式內存模型、不適用于單個系統(tǒng)無力解決的問題。

難點: 難于測試、可維護性低。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容