lockObj.wait()是否會(huì)打破鎖,打破原子性?
我加了些注釋?zhuān)^察了下。wait的線程在收到notifyAll時(shí),沒(méi)有重新競(jìng)爭(zhēng)鎖,而是從wait()后開(kāi)始執(zhí)行的。那么,嚴(yán)格來(lái)講,是否存在多個(gè)線程會(huì)同時(shí)執(zhí)行后面代碼的可能?
【本例不會(huì)出現(xiàn)是因?yàn)槊看无D(zhuǎn)移只轉(zhuǎn)移給了一個(gè)節(jié)點(diǎn),如果轉(zhuǎn)移給兩個(gè)節(jié)點(diǎn)或以上。則可能在wait后,同時(shí)有兩個(gè)節(jié)點(diǎn)滿(mǎn)足條件,則會(huì)出現(xiàn)競(jìng)爭(zhēng)的情況。】
2015-12-09
不會(huì),主要是這樣的:
先明白兩個(gè)概念:鎖池和等待池。synchronized是鎖池,wait、notify、notifyAll是等待池。等待池的對(duì)象是不會(huì)競(jìng)爭(zhēng)鎖的,當(dāng)notifyAll后,等待池中的線程會(huì)被喚醒進(jìn)入到該線程的鎖池中重新競(jìng)爭(zhēng)對(duì)象鎖,重新獲得鎖后的對(duì)象會(huì)從wait后繼續(xù)執(zhí)行代碼,其他對(duì)象會(huì)被阻塞,而不是wait。被阻塞的對(duì)象會(huì)等待下一次被喚醒(notify、notifyAll)。另外,notify不是線程安全的,notifyAll才是。
2015-12-09
確實(shí)是沒(méi)有重復(fù)執(zhí)行,我在wait后加了個(gè)outwait操作,out輸出后加了sleep操作。并驗(yàn)證了,每個(gè)out后面都一定是該線程繼續(xù)執(zhí)行,而沒(méi)有出現(xiàn)多個(gè)out并排的情況。。說(shuō)明喚醒的現(xiàn)場(chǎng)還是先做了一次鎖競(jìng)爭(zhēng),再執(zhí)行的。其他的都在競(jìng)爭(zhēng)外,等待執(zhí)行?