2 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個(gè)贊
wait()
除非當(dāng)前線程擁有該對(duì)象的監(jiān)視器,否則不能在對(duì)象上。要做到這一點(diǎn),你必須synchronize
堅(jiān)持:
class Runner implements Runnable{ public void run() { try { synchronized(Main.main) { Main.main.wait(); } } catch (InterruptedException e) {} System.out.println("Runner away!"); }}
同樣的規(guī)則也適用于notify()
/ notifyAll()
。
該Javadoc文檔wait()
提到這一點(diǎn):
此方法只應(yīng)由作為此對(duì)象監(jiān)視器所有者的線程調(diào)用。有關(guān)
拋出:notify
線程可以成為監(jiān)視器所有者的方式的說(shuō)明,請(qǐng)參閱方法。
IllegalMonitorStateException
- 如果當(dāng)前線程不是此對(duì)象監(jiān)視器的所有者。
來(lái)自notify()
:
線程以三種方式之一成為對(duì)象監(jiān)視器的所有者:
通過(guò)執(zhí)行該對(duì)象的同步實(shí)例方法。
通過(guò)執(zhí)行
synchronized
在對(duì)象上同步的語(yǔ)句的主體。對(duì)于類型的對(duì)象
Class
,通過(guò)執(zhí)行該類的同步靜態(tài)方法。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
你打電話都wait
和notifyAll
不使用synchronized
塊。在這兩種情況下,調(diào)用線程必須擁有您調(diào)用方法的監(jiān)視器上的鎖。
從文檔notify
(wait
并notifyAll
有類似的文檔,但參考notify
最完整的描述):
此方法只應(yīng)由作為此對(duì)象監(jiān)視器所有者的線程調(diào)用。線程以三種方式之一成為對(duì)象監(jiān)視器的所有者:
通過(guò)執(zhí)行該對(duì)象的同步實(shí)例方法。
通過(guò)執(zhí)行在對(duì)象上同步的synchronized語(yǔ)句的主體。
對(duì)于Class類型的對(duì)象,通過(guò)執(zhí)行該類的同步靜態(tài)方法。
一次只有一個(gè)線程可以擁有對(duì)象的監(jiān)視器。
只有一個(gè)線程能夠一次實(shí)際退出 wait
,notifyAll
因?yàn)樗麄兌急仨氃俅潍@得相同的監(jiān)視器 - 但是所有線程都會(huì)被通知,所以只要第一個(gè)線程退出同步塊,下一個(gè)將獲得鎖等
添加回答
舉報(bào)