執行緒安全性 可見性

2021-10-03 02:24:16 字數 928 閱讀 5269

執行緒交叉執行;重排序結合執行緒交叉執行;共享變數更新後的值沒有在工作記憶體與主存間及時更新

執行緒解鎖前,必須把共享變數的最新值重新整理到主記憶體;執行緒加鎖時,將清空工作記憶體中共享變數的值,從而使用共享變數時需要從主存中重新讀取最新的值(注意加鎖和解鎖是同一把鎖)

通過加入 記憶體屏障和禁止重排序優化來實現;

對volatile變數寫操作時,會在寫操作後加入一條store屏障指令,將本地記憶體中的共享變數刷到之記憶體;

對volatile變數讀操作時,會在讀操作前加入一條load屏障指令,從主記憶體中讀取共享變數。

;//執行緒1

context=

loadcontext()

;inited=

true

;//執行緒2

while

(!inited)

dosomethingwithconfig

(context)

;這段**中,執行緒1的context=loadcontext()和inited=true的操作不一定會按著**邏輯順序來的,cpu在執行時很可能重排序從而導致先執行inited=true再執context=loadcontext(),這樣就會導致執行緒2傳入dosomethingwithconfig中的內容為空。為了解決這個問題使用valatile 修飾inited,禁止**執行順序的重排序,那麼在執行inited=true之前一定會按著**的邏輯順序去先執行context=loadcontext()。

執行緒安全性

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

執行緒安全性

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

執行緒的原子性與可見性

同步最基本的目的是保證原子性。另乙個容易忽略的目的是可見性,即乙個執行緒修改的共享資料對另乙個執行緒可見。因為一些基本型別的賦值操作本身是原子的。所以針對這些賦值操作在不使用synchronized的情況下,可以使用volatile來解決乙個執行緒的修改對另乙個執行緒的可見。所以volatile是在...