文章出處

首先要明白線程的工作原理,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。這就是“線程不安全”了。

原文摘自 http://www.cnblogs.com/zwq194/archive/2012/06/26/2563567.html


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()