執行緒(四)解決執行緒不安全問題

2021-10-08 14:23:39 字數 1155 閱讀 2234

一、何為執行緒不安全?

執行緒安全: 多執行緒併發執行時, 沒有產生邏輯錯誤

執行緒不安全: 多執行緒併發執行時, 產生邏輯錯誤

體會執行緒不安全:

static

class

counter

public

static

void

main

(string[

] args)

throws interruptedexception }}

; thread t2 =

newthread()

}}; t1.

start()

; t2.

start()

; t1.

join()

; t2.

join()

;// 併發執行

system.out.

println

(counter.count);}

}

可以總結出線程不安全的理由:

執行緒是搶占式執行的(執行緒 t1, t2 是搶占式執行的)

自增操作不是原子的(每次 ++ 都能拆分成三個步驟),

執行任何一步時, 都可能被排程器排程走

多個執行緒嘗試修改同乙個變數(兩線程同時修改 count, count 並沒有增加)

記憶體可見性導致的執行緒安全問題 (防止編譯器過度優化:出現乙個執行緒讀,乙個執行緒寫的情況)

指令重排序 (編譯器在編譯**時, 會針對指令進行優化, 調整指令的執行順序, 提公升程式執行效率)

二、解決執行緒不安全:

給自增操作加 鎖, 使其變為原子操作。

鎖的關鍵字: synchronized (英文原意: 同步)

鎖的特點: 互斥

同一時刻只有乙個執行緒能獲取到鎖, 其他嘗試獲取鎖的執行緒會發生阻塞等待,

一直到剛才獲取了鎖的執行緒釋放鎖, 剩下的執行緒才能重新競爭

ps: 加鎖(獲取鎖) lock 解鎖(釋放鎖)unlock

關鍵字 volatile:

保持記憶體可見性, 解決乙個執行緒讀,乙個執行緒寫的情況。

雙重 if 保證效率

三、執行緒安全的具體實現

四、雙重 if 實現(單例模式)

執行緒不安全

背景 執行緒不安全 sleep 模擬網路延遲 後多執行緒併發訪問同乙個資源 方法1 同步 塊 語法 synchronized 同步鎖 catch interruptedexception e 方法2 同步方法 使用synchronizd修飾的方法,就叫同步方法,保證a執行緒執行該方法的時候,其他執行...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...