談談多執行緒程式設計(一) 安全性策略

2022-03-03 06:21:27 字數 753 閱讀 1619

在多執行緒程式設計中,安全是我們考慮的最重要的因素。通常程式設計師都會使用鎖來滿足安全要求,但是只用鎖並不能寫出良好的多執行緒**,因此我們有必要更深入一點,對執行緒安全策略進行更加全面的了解。首先談談影響執行緒安全的因素:

有三個因素影響到了多執行緒下的安全性:原子性、可見性和指令順序

請看下面的**:

不安全的屬性讀寫

1public

short

zoomlevel24

set5}6

short變數的讀寫能滿足原子性要求,但是在沒有使用同步或interlock類的情況下,不能保證可見性要求,因此仍不是執行緒安全的。

從狀態機的角度來看,每個物件都具有若干個一致性狀態,在執行過程中,所有的公共方法執行前後,物件都不應違反一致性約束,這樣的**我們通常認為是安全的。比如對於基於鍊錶的佇列,佇列尾節點的next變數總是指向null,不論在出列/入列完成前後,這一約束都應該滿足。

以基於鍊錶的隊列為例來說明這2類策略:

對上面的過程,基於鎖的策略將使用類似下面的**來保證另乙個執行緒不能訪問到圖2的狀態

基於鎖的入列偽**

1lock

(_lock)26

如果使用非阻塞演算法,當乙個執行緒執行到圖2後被中斷,而另乙個入列的執行緒發現佇列已經處於圖2的狀態時,將會試圖更新trail到圖3的狀態,然後再執行增加的操作,具體的**可參考這裡。不論是鎖還是非阻塞演算法,都能正確維護物件的一致性狀態。

實現獨佔技術有三種基本的策略:

待續。。。

java多執行緒之執行緒的安全性 一

物件的狀態 物件的狀態是指儲存在狀態變數 例項或靜態域 中的資料。物件的狀態還可能包括其他依賴物件的域。例如,hashmap的狀態不僅儲存在物件本身,還儲存在map.entry物件中。多執行緒安全的概念 當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式或者這些執行緒將如何交替執行,並且在主調...

執行緒安全性

定義 當多個執行緒訪問某個類時,不管執行環境採用何種呼叫方式或者這些執行緒如何交替執行,並且在主調 中不需要任何額外的同步或者協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。主要表現三個方面 atomic cas unsafe.compareandswapint atomiclong...

執行緒安全性

執行緒安全性 當多個執行緒訪問某個類時,這個類始終都能表現出正確的行為,那麼稱這個類是執行緒安全的。執行緒不安全產生的問題 競態條件 由於不恰當的執行時序而出現不正確的結果。大多數競態條件的本質是基於一種可能失效的觀察結果來做出判斷或者執行某個計算。常見先檢查後執行,延遲初始化 單例模式 讀取 修改...