1. 程式人生 > >java併發實戰-基礎知識

java併發實戰-基礎知識

1.執行緒安全

共享:變數可以由多個執行緒同時訪問.可變:變數值在生命週期內可以變化.

當多個執行緒訪問某個類時,這個類始終都能表現出正確的行為,稱這個類是執行緒安全的.

無狀態物件是執行緒安全的.

2.原子性

競態條件:由於不恰當的執行時序而出現不正確的結果,是一種非常重要的情況.

a.先檢查後執行是一種常見的延遲初始化操作.目的是:將物件的初始化操作推遲到實際被使用時才執行.同時要確保只被初始化一次.

3.複合操作

避免競態條件問題,必須在某執行緒修改該變數時,通過某種方式防止其讓執行緒使用這個變數.從而確保其他執行緒只能在修改操作完成之前或之後讀取和修改狀態,而不是在修改過程.有兩個操作A和B,當一個執行緒執行的時候要麼執行完,要麼不執行.那A和B對彼此來說就是原子性的,

4.加鎖操作

要保持狀態一致性就需要在單個原子操作中更新所有相關的狀態變數.

5.重入

重入獲取鎖的操作粒度是執行緒,而不是呼叫.重入的一種實現方式是:為每個鎖關聯一個獲取計數和一個所有者執行緒.當計數值為0,當計數值為0,認為這個鎖沒有被任何執行緒持有.

6.用鎖來保護狀態

每個共享的和可變的變數都應該只由一個鎖來保護,從而使維護人員知道是哪個鎖.

在簡單性和效能之間存在著相互制約因素,當實現某個同步策略時,一定不要盲目為了效能而犧牲簡單性.

當執行時間較長或者無法完成的操作(如網路I/O,或控制檯I/O)一定不要持有鎖.