什麼是執行緒安全和執行緒不安全

coding_1994發表於2018-07-22

1.可以這樣理解,加鎖的就是安全的,不加鎖的就是不安全的(感覺比較生動,不知道對不對,望指出)

 

2.到底是什麼意思呢?

如果你的程式碼所在的程式中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。

好比你有兩個一模一樣的銀行卡(賬戶一樣,餘額一樣,當然現實中是沒有的),假如卡上餘額1000塊,而你跟你女朋友同時在不同的ATM上面取1000塊錢(是同時哦,理想中的同時),如果執行緒不安全,那麼倆人都能同時取出1000塊(賺死了)。而如果執行緒安全的話,只能一個人同時操作一個賬戶,當這個賬戶正在被操作時,是被鎖起來的,不給別人動的,只能你自己動,你動完了別人才能動。

 

3.為什麼會有執行緒安全問題?

執行緒安全問題都是由全域性變數靜態變數引起的。

若每個執行緒中對全域性變數靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則的話就可能影響執行緒安全。

安全性:

比如一個 ArrayList 類,在新增一個元素的時候,它可能會有兩步來完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。

單執行緒執行的情況下,如果 Size = 0,新增一個元素後,此元素在位置 0,而且 Size=1;

而如果是在多執行緒情況下,比如有兩個執行緒,執行緒 A 先將元素存放在位置 0。但是此時 CPU 排程執行緒A暫停,執行緒 B 得到執行的機會。執行緒B也向此 ArrayList 新增元素,因為此時 Size 仍然等於 0 (注意哦,我們假設的是新增一個元素是要兩個步驟哦,而執行緒A僅僅完成了步驟1),所以執行緒B也將元素存放在位置0。然後執行緒A和執行緒B都繼續執行,都增加 Size 的值。

那好,我們來看看 ArrayList 的情況,元素實際上只有一個,存放在位置 0,而 Size 卻等於 2。這就是“執行緒不安全”了

 

相關文章