線程安全和線程不安全

什麼是線程安全和線程不安全

首先要明白線程的工作原理,jvm有一個main   memory,而每個線程有自己的working   memory,一個線程對一個variable進行操作時,都要在自己的working   memory裏面建立一個copy,操作完之後再寫入main   memory。多個線程同時操作同一個variable,就可能會出現不可預知的結果。根據上面的解釋,很容易想出相應的scenario。 
而用synchronized的關鍵是建立一個monitor,這個monitor可以是要修改的variable也可以其他你認爲合適的object比如method,然後通過給這個monitor加鎖來實現線程安全,每個線程在獲得這個鎖之後,要執行完   load到workingmemory   ->   use&assign   ->   store到mainmemory   的過程,纔會釋放它得到的鎖。這樣就實現了所謂的線程安全。

------------------------------------------------------

什麼是線程安全?線程安全是怎麼完成的(原理)? 
線程安全就是說多線程訪問同一代碼,不會產生不確定的結果。編寫線程安全的代碼是低依靠線程同步。

------------------------------------------------------

在接口方式中,線程有一個共享的數據成員,即: private   int   count   =10; 
而在繼承方式中,線程之間沒有共享的成員,而是各線程各自有一個私有成員,即: private   int   count   =10; 
樓主的代碼剛好是一個好例子,說明了何時需要考慮線程同步,並在一定程序上說明了怎樣才能編寫出線程安全的代碼。 
在多線程環境中,當各線程不共享數據的時候,那麼一定是線程安全的。問題是這種情況並不多見,在多數情況下需要共享數據,這時就需要進行適當的同步控制了。

--------------------------------------------------------

線程安全一般都涉及到synchronized 就是一段代碼同時只能有一個線程來操作 不然中間過程可能會產生不可預製的結果

---------------------------------------------------------

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

舉例 比如一個 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。這就是“線程不安全”了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章