執行緒安全 執行緒不安全

2021-08-31 05:38:39 字數 1129 閱讀 5515

執行緒安全是針對多執行緒來講的:

如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這就是執行緒不安全;

相反公用變數在保護機制下工作,就不會出現「隨機」變化,這時叫執行緒安全。

執行緒安全:在多執行緒中使用時,不用自己做同步處理;

執行緒不安全:在多執行緒中使用時,必須做執行緒同步,不然會有未知後果。

執行緒的工作原理:jvm有乙個main memory,而每個執行緒有自己的working memory,乙個執行緒對乙個variable進行操作時,都要在自己的working memory裡面建立乙個copy,操作完之後再寫入main memory。多個執行緒同時操作同乙個variable,就可能會出現不可預知的結果。

可以用synchronized來解決

synchronized的關鍵是建立乙個monitor,這個monitor可以是要修改的variable也可以其他你認為合適的object比如method,然後通過給這個monitor加鎖來實現執行緒安全,每個執行緒在獲得這個鎖之後,要執行完load到working memory -> use&assign -> store到main memory的過程,才會釋放它得到的鎖。這樣就實現了所謂的執行緒安全。

例如:

vector執行緒安全  arraylist非執行緒安全,但卻節約系統效能:

乙個arraylist類,在新增乙個元素的時候,它可能會有兩步來完成:

1、在item[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,這就是"執行緒不安全"了

安全執行緒佇列(二)

在之前的基礎上增加了條件變數,相比之前的等待時間減少,處理速度更快 brief cthreadsafequeue 基於鎖和條件變數的執行緒安全棧 brief 相對來說比上面設計上不需要過多的加鎖等待,速度要更快 template class ccondsafequeue public cthread...

執行緒不安全

背景 執行緒不安全 sleep 模擬網路延遲 後多執行緒併發訪問同乙個資源 方法1 同步 塊 語法 synchronized 同步鎖 catch interruptedexception e 方法2 同步方法 使用synchronizd修飾的方法,就叫同步方法,保證a執行緒執行該方法的時候,其他執行...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...