1. 併發和並行:乙個好的併發演算法未必是乙個好的並行演算法
2. 併發程式設計的2個設計要點:安全和效能,在多cpu環境下還要考慮可擴充套件性
3. 安全性:
a. 最常見的方法是要求物件在任意時刻都應該滿足一致的狀態(不變約束)
b. 在某些無阻塞演算法中,允許物件暫時處於不一致狀態,但是應該在執行中檢測並立刻修正它
4. 影響安全的因素:原子性、可見性和指令順序
5. 滿足安全性的基本策略:
a. 通過物件的不可變性保證物件總是滿足不變約束:乙個不變物件是執行緒安全的
a. 無狀態變數的物件,靜態方法
b. 所有狀態變數均不可變的物件
c. 可以嘗試把原來可變的物件變成不可變物件(使用建立新例項再替換的方法)以減少同步的要求
d. 實現不變物件要特別注意:在建構函式完全前,不能使用物件!危險在於建構函式中對this的洩漏(物件的逸出問題)
b. 同步
a. 鎖
b. 原子變數
c. 其他工具類 (訊號量,監視器)
e. 防止死鎖 (順序化資源)
d. 限制:限制對物件的併發訪問
6. 提高擴充套件性的策略:
關鍵在於減少序列**:
a. 減少鎖的使用
a. 是否可以允許過期資料?
a. a. 減少鎖的範圍,有可能阻塞的操作應該排除在鎖的範圍外,將共享變數的內容儲存到本地變數,然後再鎖的範圍外操縱本地變數
b. 分解鎖
對互相獨立的共享變數,可以使用不同的鎖(分拆鎖);例子:對佇列,可以使用2個鎖分別鎖定頭尾
使用讀寫鎖來代替普通的鎖;
可以考慮用多個鎖來代替乙個大鎖(分離鎖),jdk1.5總的併發hashmap使用了16個鎖來代替乙個大鎖以提高吞吐率,同樣,在計算hashmap.size時,將分別計算各部分的size再彙總,以避免鎖定整個物件
c. 當在乙個操作中需要同步多個共享變數時,為了減少同步多個變數帶來的複雜性,可將多個變數放入乙個單獨的狀態物件,然後使用新建並替換的方式減少甚至消除同步的要求
d. 某些情況下可以用原子變數來代替鎖
e. 使用非阻塞演算法來代替鎖
f. 遍歷集合很難避免鎖,但是可以考慮使用版本化迭代變數或者快取的資料來減少鎖的需要
g. 考慮使用不變數/唯讀介面卡(p98)
7. 執行緒協調和依賴
8. 管理執行緒
34 併發程式設計 併發並行
一 併發 無論是並行還是併發,在使用者看來都是 同時 執行的,不管是程序還是執行緒,都只是乙個任務而已,真是幹活的是cpu,cpu來做這些任務,而乙個cpu同一時刻只能執行乙個任務。併發 是偽並行,即看起來是同時執行。單個cpu 多道技術就可以實現併發,並行也屬於併發 二 並行 並行 並行 同時執行...
並行程式設計 併發級別
1.1 wait freedom 無等待併發 wait freedom 指的是每乙個執行緒都一直執行下去而無須等待外部條件,整個流程中任何操作都能在乙個有限的步驟內完成,這是最高的併發級別,沒有任何阻塞。結合之前原子操作部分的知識,可以簡單認為能夠直接呼叫乙個原子操作實現的演算法或程式就屬於wait...
java併發程式設計 並行和併發(1)
1.為什麼需要並行?效能 在多核cpu提高效能業務需求 平行計算還出於業務模型的需要 並不是為了提高系統效能,而是確實在業務上需要多個執行單元。比如http伺服器,為每乙個socket連線新建乙個處理執行緒 讓不同執行緒承擔不同的業務工作 簡化任務排程 2.概念 同步 synchronous 和非同...