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