首先要明白執行緒的工作原理,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。這就是「執行緒不安全」了。
原文摘自
什麼是執行緒安全和執行緒不安全
首先要明白執行緒的工作原理,jvm有乙個main memory,而每個執行緒有自己的working memory,乙個執行緒對乙個variable進行操作時,都要在自己的working memory裡面建立乙個copy,操作完之後再寫入main memory。多個執行緒同時操作同乙個variable...
什麼是執行緒安全和執行緒不安全
首先要明白執行緒的工作原理,jvm有乙個main memory,而每個執行緒有自己的working memory,乙個執行緒對乙個variable進行操作時,都要在自己的working memory裡面建立乙個copy,操作完之後再寫入main memory。多個執行緒同時操作同乙個variable...
什麼是執行緒安全和執行緒不安全
首先要明白執行緒的工作原理,jvm有乙個main memory,而每個執行緒有自己的working memory,乙個執行緒對乙個variable進行操作時,都要在自己的working memory裡面建立乙個copy,操作完之後再寫入main memory。多個執行緒同時操作同乙個variable...