1.明確哪些**是多執行緒執行的**,
2.明確共享資料
3.明確多執行緒執行**中哪些語句是操作共享資料.
首先第一步,找到多執行緒執行的**
也就是run方法裡面的**
for (int i = 0; i < 3; i++)
另外這裡用到了add方法,所以add也算
public void add(int n)
第二步,找到共享資料
bank b = new bank();
private int sum = 0;
第三步,明確多執行緒使用的共享資料.
首先對於資料b就一條語句使用了這個共享變數,因此不會出現執行緒不安全,但是對於sum,有兩條語句使用的,所以就會出現執行緒安全問題,
解決辦法,同步塊
object obj = new object();
public void add(int n)
}
或者,同步函式
public synchronized void add(int n)
以上就是執行緒安全的解決辦法,同步機制雖然遊俠,但是帶來了一定的效能損耗,所以,對操作共享資料的部分執行同步,儘量減少這種損耗
補充:如果同步函式是靜態的,那麼使用的鎖就必須是所在類的位元組碼檔案物件,也就是 類名.class,解釋來說,靜態是和類一起載入的,所以在靜態載入的時候是不可能有object的物件,所以鎖就必須用在靜態加在之前的乙個物件.
多執行緒 執行緒安全問題簡單分析
有看過有人買火車票,乙個人在飛豬買,乙個人在12306買,買到了同一張票。也有看到過,庫存中已經沒貨了但是仍然賣出去了。超買,超賣,秒殺等問題就是執行緒安全問題。多個執行緒操作同乙個共享變數。為 a b c a處有判斷,b處有相關業務,c處有共享變數資料改變。在某個時間,有三個執行緒 1 執行緒1首...
多執行緒 執行緒安全
原因 當多個執行緒同時共享,同乙個全域性變數或靜態變數。做寫的操作時,可能發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。解決方案 方式一 內建鎖synchronized synchronized保證執行緒原子性,當執行緒進入方法的時候,自動獲取鎖,一旦鎖被其它執行緒獲取...
多執行緒 執行緒安全
public class unsafethread t.start while thread.activecount 1 system.out.println sum 1 從主記憶體中講sum變數複製到執行緒的工作記憶體 2 在工作記憶體中修改變數 1操作 3 將sum變數從執行緒的工作記憶體寫回到...