首先看下如果沒加同步**塊會造成什麼樣的執行緒安全問題:
public class demo014
}class ticket extends thread
模擬有多段**執行
try catch (interruptedexception e)
system.out.println(getname() + "...這是第" + ticket-- + "號票");}}}
結果如下:
分析:執行緒thread-3進入到while迴圈的時候,ticket為1,然後遇到thread.sleep(10),此刻還未執行到ticket--,ticket還是為1。與此同時執行緒thread-2和thread-1進入,因為ticket為1所以未執行break。
隨後thread-3執行ticket--,ticket變為1;然後thread-2和thread-1同時執行ticket--,所以出現兩個ticket為-1的情況。
解決:加同步**塊
public class demo014
}class ticket extends thread
模擬有多段**執行
try catch (interruptedexception e)
system.out.println(getname() + "...這是第" + ticket-- + "號票");
}} }
}
Java多執行緒4 安全問題
這樣的執行機制就可能會導致多執行緒的安全問題 1.多個執行緒操作共享資料 2.在乙個執行緒中有多行 操作共享資料 改變共享資料 解決思路 乙個執行緒在執行執行緒任務的時候將多條操作共享資料的 一起執行,在執行過程中不允許其他執行緒執行 體現 package thread class tickets ...
多執行緒安全問題
這裡的安全問題可以理解為 實現在邏輯上的問題,比如 火車站賣票 100張票讓4個人去賣,一定不能出現賣的票是負數問題,那麼開啟多執行緒後,如何才能保證賣的票不可能存在負數呢?常用的解決方法有兩種 1,使用同步 塊,把需要同步的 再放同步 塊中 2,使用同步函式 同步的鎖,可以理解為就是那個物件!同步...
Java 多執行緒存在的安全問題
存在的問題 當num 1時,假如執行緒t1此時拿到cpu,執行任務 在判斷if語句條件剛剛結束時,也就是還沒來得及執行輸出語句,cpu被t2搶走了,此時num依然等於1,那麼if條件通過,在執行過程中,依然可能被其他執行緒搶走cpu而進入阻塞狀態,最後有可能賣出0,1,2這種票,這就是多執行緒存在的...