3 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
private Boolean isOn = false;
public void doSomeStuffAndToggleTheThing(){
synchronized(isOn){
這是一個(gè)可怕的主意。isOn將引用與Boolean.FALSE公開(kāi)可用的對(duì)象相同的對(duì)象。如果其他任何編寫錯(cuò)誤的代碼也決定鎖定該對(duì)象,則兩個(gè)完全不相關(guān)的事務(wù)將不得不彼此等待

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
我認(rèn)為您的問(wèn)題更多是同步本身,而不是布爾值同步。想象一下,每個(gè)線程都是一條道路,語(yǔ)句(汽車)在其中一條接一條。在某個(gè)點(diǎn)上可能有交叉點(diǎn):如果沒(méi)有信號(hào)燈,可能會(huì)發(fā)生沖突。Java語(yǔ)言有一種內(nèi)置的描述方式:由于任何對(duì)象都可以是交集,因此任何對(duì)象都有一個(gè)關(guān)聯(lián)的監(jiān)視器充當(dāng)信號(hào)燈。在代碼中使用同步時(shí),您將創(chuàng)建一個(gè)信號(hào)量,因此,您必須對(duì)所有道路(線程)使用相同的信號(hào)量。因此,此問(wèn)題并不是真正的布爾特定的,因?yàn)閮H存在兩個(gè)布爾值,因此每次在實(shí)例變量上進(jìn)行同步然后將同一變量指向另一個(gè)對(duì)象時(shí),都會(huì)發(fā)生此問(wèn)題。因此,您的代碼使用布爾運(yùn)算是錯(cuò)誤的,但是使用整數(shù)則同樣危險(xiǎn),
添加回答
舉報(bào)