首先我們有兩個執行緒,在做i++的時候,看似是一條語句,實際上是三個步驟在執行。假設最開始 i 的值是1,理論估計在經過兩個執行緒之後,i 的值應該為3。但是實際上結果是2,那麼具體的流程是怎樣的呢 ?第乙個執行緒在拿到1之後把它加了,但是並沒有立刻把它寫進去,導致第二個執行緒在拿的時候,由於第乙個執行緒的值雖然計算完畢了,但是沒有告訴任何人,因此第二個執行緒拿到的還是1,於是呢它就把拿到的1再去加1。此時我們的執行緒又切回到1,這個時候執行緒1對於執行緒2 的內容是一概不知的,它就執行剛才未完的步驟,於是它就把2寫回去了 ,而此時一旦切換到執行緒2,執行緒2也對與執行緒1的操作也是一概不知的,所以他也把2寫回去。所以這就使得原本等於3的數字等於2。(結合上圖理解)
package deadlock;
/** * 描述: 必定發生死鎖的情況
*/public class mustdeadlock implements runnable
@override
public void run()
catch (interruptedexception e)
synchronized (o2)}}
if (flag == 0)
catch (interruptedexception e)
synchronized (o1)}}
}}
執行緒安全問題
執行緒安全問題導致的原因 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒有徹底執行完畢,此時另乙個執行緒參與進來執行,導致共享資料的錯誤。執行緒安全解決辦法 對多條操作共享的語句,每次只能讓乙個執行緒執行完成。在執行的過程中,其他執行緒不可以參與執行。解決方案 同步...
執行緒安全問題
是指 在多個執行緒進行的情況下對全域性變數或靜態變數進行寫的操作的時候出現的資料上的問題,就是執行緒安全的問題,在讀的時候不會出現執行緒的問題 即 public void run catch interruptedexception e synchronized this 即 package com...
執行緒安全問題
由於cpu輪流切換執行緒導致某執行緒沒來的及執行完,執行緒的共享變數便直接被其他執行緒所修改。package 執行緒安全問題 public class mainclass2 class ticket extends threadcatch interruptedexception e system....