起100個執行緒 + 1,迴圈100次檢視結果,正常來說應該是100對吧
public static int t = 0;
public static void main(string args) throws interruptedexception
}).start();
}//列印t的值
system.out.println(t);
t = 0;}}
public static void add()
可以看出100個執行緒操作成員變數a,執行緒不安全,可以將 t after 注釋開啟看下就明白了 結果如下
t after 951.加synchronized,範圍越小越好,因為是阻塞的,這裡可以對add方法加上此關鍵字t after 96
t after 97
t after 98
t after 99
99
2.lock,同樣可以對a = a + 1上鎖
3.利用juc類,如atomicintege
這裡用atomicinteger舉例,是通過cas來保證執行緒安全的,不懂的可以去查查
public static atomicinteger t = new atomicinteger(0);
public static void main(string args) throws interruptedexception
}).start();
}//列印t的值
system.out.println(t);
thread.sleep(2000);//每隔2s置0重計數
t = new atomicinteger(0);}}
public static void add()
結果如下
t after 95會發現列印t的值是98,但是後續又執行了2次完畢,而最後的結果才是我們想要列印的值,所以可以在列印t之前等待2s,以等待執行緒執行完畢,t的列印就會正確了t after 96
t after 97
t after 98
98t after 99
t after 100
關於執行緒安全的學習
背景 最近在學習一套庫函式,因為涉及到資料的讀寫操作,所以庫函式提供了lock與unlock函式用於對寫操作進行保護。需要保護的原因是函式庫沒有自己的執行緒,它們執行在庫函式呼叫者的執行緒中 所以如果沒有保護機制,如果出現多個執行緒同時去做寫資料操作就會導致共享資料出錯 這類函式也稱之為非執行緒安全...
執行緒 售票小測試
實現 class ticket extends thread public void run else break class ticketdemo2 輸出樣例 一號視窗.100 一號視窗.99 一號視窗.98 一號視窗.97 一號視窗.96 一號視窗.95 一號視窗.94 四號視窗.100 二號視...
關於執行緒的小理
執行緒的生命週期 新建 建立執行緒物件 就緒 執行緒物件已經啟動了,但是還沒有獲取到cpu的執行權 執行 獲取到了cpu的執行權 阻塞 沒有cpu的執行權,回到就緒 死亡 執行完畢,執行緒消失 sleep 方法和wait方法的區別 sleep方法必須傳入引數,引數就是時間,時間到了自動醒來 wait...