与wait()方法类似,如果未在调用对象(对于wait())上授予锁定,例如通过对调用对象进行同步,则会抛出IllegalMonitorStateException。
我想知道
像wait()方法一样,我们可以通过编写一些代码来确保锁被授予吗? 还是仅由JVM完成?
答案 0 :(得分:4)
只需写下:
synchronized (thing) {
thing.wait ();
}
如果它尚未锁定,它将被锁定,如果它已经锁定,那就没关系。
答案 1 :(得分:3)
您可以致电Thread.holdsLock()查看是否持有锁。但是,您应该设计代码,以便知道是否有锁。你应该能够静态地确定它。
通知/等待在Java 5之前很有用。如果你有Java 5或更高版本,使用并发库可能是更好的选择。
编辑:我指的是2004年添加的并发包http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html,http://download.oracle.com/javase/tutorial/essential/concurrency/highlevel.html之前它是一个外部并发库。 http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
答案 2 :(得分:0)
我不了解Java,但通常的锁定语义是当你尝试获取一个锁时,你会阻塞直到你得到它。这意味着无需验证您是否确实获得了锁定 - 当流程到达下一行时,您可以确定您已被锁定。当你开始尝试用锁做其他事情时,比如试图检查它是否被锁定,你通常做错了。