我对同步实际如何工作感到困惑。我有以下代码:
public class FunTest {
static FunTest test;
public void method() {
synchronized (test) {
if (Thread.currentThread().getName() == "Random1") {
try {
wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
} else {
notify();
}
}
}
public static void main(String[] args) {
test = new FunTest();
final FunTest t0 = new FunTest();
Thread t1 = new Thread(new Runnable() {
public void run() {
t0.method();
}
});
Thread t3 = new Thread(new Runnable() {
public void run() {
t0.method();
}
});
t1.setName("Random1");
t3.setName("Random2");
t1.start();
t3.start();
}
}
代码在运行时抛出IllegalMonitorStateException
。我不明白为什么会这样。难道不可能以这种方式获得锁吗?
如果我在同步块中将test
替换为this
,它可以正常工作。为什么会这样?
答案 0 :(得分:2)
您在test
上打开了一个监视器阻止,但是您将wait()
和notify()
应用于this
。
答案 1 :(得分:0)
根据wait()的javadoc
“当前线程必须拥有此对象的监视器”
在你的情况下,它不是。
将t0.method();
更改为test.method()
即可。但不确定你的用例。