public class Main2 {
public static void main(String[] args) {
new Test2().start();
new Test2().start();
}
}
class Test2 extends Thread {
@Override
synchronized public void run() {
try {
System.out.println("begin wait");
wait();
} catch (Exception ex) {
}
}
}
由於運行測試的實際結果: 從兩個線程開始等待, 開始等待, 兩次。 對比預期結果: 開始等待, 只有一次來自兩個線程之一,因爲wait()是在synchronized run()方法內部調用的。 爲什麼可以調用Object的wait()中斷線程同步?呼叫到Java對象的wait()打破線程同步
Thans很多!
public class Main3 {
public static void main(String[] args) {
Test3 t = new Test3();
new Thread(t).start();
new Thread(t).start();
}
}
class Test3 implements Runnable {
synchronized public void run() {
try {
System.out.println("begin wait");
wait();
} catch (Exception ex) {
}
}
}
@akf & @Sean歐文
感謝您的答覆。對不起我的錯誤,現在我修改了代碼以將同步放在同一對象的run()上,結果仍然存在:開始等待,開始等待兩次。
@akf
等待將釋放鎖 同步已經抓住,並將於 再得到一次線程通知。
您能詳細說明一下嗎?
感謝您的示例和javadoc參考! – sof 2010-06-29 14:17:48
可能需要注意的是,選擇哪個線程喚醒是任意的。一個很好的實現將是公平的,並會按他們所謂的wait()的順序通知線程,但這不是必需的。所以唯一的限制就是'[N]。步驟1'在'[N]之前發生。步驟2',其中N始終爲1或2. – 2010-06-29 18:11:05
@馬克斯彼得斯,這是一個很好的點 - 雖然它可能不是任意的(即,經驗證據可能試圖說服你,它是有序的),那裏是沒有保證的。 – akf 2010-06-29 18:17:35