亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在Boolean上同步不是一個好習慣?

為什么在Boolean上同步不是一個好習慣?

慕桂英546537 2019-12-15 11:12:00
我的建筑師總是說永遠不要同步布爾值我無法理解原因,如果有人可以舉例說明為什么這不是一個好習慣,我將不勝感激。 參考樣本代碼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公開可用的對象相同的對象。如果其他任何編寫錯誤的代碼也決定鎖定該對象,則兩個完全不相關的事務將不得不彼此等待


查看完整回答
反對 回復 2019-12-16
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

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


查看完整回答
反對 回復 2019-12-16
  • 3 回答
  • 0 關注
  • 280 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號