如果不在同步块中使用 wait 和 notify 方法会怎样?有用吗?
what happen if using wait and notify methods not in a synchronized blocks ? is it useful?
关于同步的两个问题
- 如果在非同步块中使用 wait 和 notify 方法会怎样?有用吗?
synchronized对象和wait方法的对象应该一样吗?我可以这样做吗:
synchronized (o) {
try {
this.wait();
} catch (InterruptedException e) {
}
}
如果当前线程在调用对象的 wait()
或 notify()
方法之前未能对对象进行 synchronize
,则会抛出 IllegalThreadStateException
。所以,不,它没有用。
是的,重申上述内容,线程必须 synchronize
在它调用 wait()
或 notify()
的同一实例上。因此,该示例仅在 o == this
.
时有效
我找不到使用 wait()
和 notify()
的充分理由,因为引入了 java.util.concurrent
,而且 synchronized
现在也不太有用了。我向初学者(更易于使用)和高级(更强大和正确)的程序员推荐该包中的高级工具。
1.
您不能在 synchronized
块之外调用 wait()
或 notify()/notifyAll()
,这些块在方法调用所属的对象上进行同步。如果你尝试,你会得到一个 IllegalMonitorStateException
.
2.
您 需要 在您的 wait()/notify()/notifyAll()
调用所属的同一对象上进行同步。例如,您的代码将抛出编写的 IMSE。您需要调用 synchronized(this){ ...
。
关于同步的两个问题
- 如果在非同步块中使用 wait 和 notify 方法会怎样?有用吗?
synchronized对象和wait方法的对象应该一样吗?我可以这样做吗:
synchronized (o) { try { this.wait(); } catch (InterruptedException e) { } }
如果当前线程在调用对象的
wait()
或notify()
方法之前未能对对象进行synchronize
,则会抛出IllegalThreadStateException
。所以,不,它没有用。是的,重申上述内容,线程必须
synchronize
在它调用wait()
或notify()
的同一实例上。因此,该示例仅在o == this
. 时有效
我找不到使用 wait()
和 notify()
的充分理由,因为引入了 java.util.concurrent
,而且 synchronized
现在也不太有用了。我向初学者(更易于使用)和高级(更强大和正确)的程序员推荐该包中的高级工具。
1.
您不能在 synchronized
块之外调用 wait()
或 notify()/notifyAll()
,这些块在方法调用所属的对象上进行同步。如果你尝试,你会得到一个 IllegalMonitorStateException
.
2.
您 需要 在您的 wait()/notify()/notifyAll()
调用所属的同一对象上进行同步。例如,您的代码将抛出编写的 IMSE。您需要调用 synchronized(this){ ...
。