hgc-ghc
          Good Good Study!!! Day Day Up!!!
          posts - 40,comments - 3,trackbacks - 0

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

          posted on 2012-09-26 22:53 宏才 閱讀(472) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 厦门市| 巴彦淖尔市| 西青区| 雅安市| 淄博市| 报价| 安化县| 汕尾市| 遂溪县| 宜州市| 永登县| 小金县| 兰考县| 云和县| 龙南县| 昌乐县| 广灵县| 漾濞| 遵义县| 深圳市| 溧水县| 芷江| 清镇市| 怀宁县| 葵青区| 城口县| 邢台市| 沂源县| 佛坪县| 象山县| 贡嘎县| 绥化市| 遂川县| 昭通市| 晋中市| 岢岚县| 保亭| 阳原县| 乳源| 仁布县| 东方市|