我的建筑師總是說永遠不要同步布爾值我無法理解原因,如果有人可以舉例說明為什么這不是一個好習慣,我將不勝感激。 參考樣本代碼private Boolean isOn = false;private String statusMessage = "I'm off";public void doSomeStuffAndToggleTheThing(){ // Do some stuff synchronized(isOn){ if(isOn){ isOn = false; statusMessage = "I'm off"; // Do everything else to turn the thing off } else { isOn = true; statusMessage = "I'm on"; // Do everything else to turn the thing on } }}
3 回答

慕容708150
TA貢獻1831條經驗 獲得超4個贊
private Boolean isOn = false;
public void doSomeStuffAndToggleTheThing(){
synchronized(isOn){
這是一個可怕的主意。isOn將引用與Boolean.FALSE公開可用的對象相同的對象。如果其他任何編寫錯誤的代碼也決定鎖定該對象,則兩個完全不相關的事務將不得不彼此等待

慕神8447489
TA貢獻1780條經驗 獲得超1個贊
我認為您的問題更多是同步本身,而不是布爾值同步。想象一下,每個線程都是一條道路,語句(汽車)在其中一條接一條。在某個點上可能有交叉點:如果沒有信號燈,可能會發生沖突。Java語言有一種內置的描述方式:由于任何對象都可以是交集,因此任何對象都有一個關聯的監視器充當信號燈。在代碼中使用同步時,您將創建一個信號量,因此,您必須對所有道路(線程)使用相同的信號量。因此,此問題并不是真正的布爾特定的,因為僅存在兩個布爾值,因此每次在實例變量上進行同步然后將同一變量指向另一個對象時,都會發生此問題。因此,您的代碼使用布爾運算是錯誤的,但是使用整數則同樣危險,
添加回答
舉報
0/150
提交
取消