以编程方式检查是否授予锁定?

时间:2011-01-27 09:26:54

标签: java multithreading concurrency

与wait()方法类似,如果未在调用对象(对于wait())上授予锁定,例如通过对调用对象进行同步,则会抛出IllegalMonitorStateException。

我想知道

像wait()方法一样,我们可以通过编写一些代码来确保锁被授予吗? 还是仅由JVM完成?

3 个答案:

答案 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.htmlhttp://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,但通常的锁定语义是当你尝试获取一个锁时,你会阻塞直到你得到它。这意味着无需验证您是否确实获得了锁定 - 当流程到达下一行时,您可以确定您已被锁定。当你开始尝试用锁做其他事情时,比如试图检查它是否被锁定,你通常做错了。