2011-01-27 113 views
0

像在wait()方法中一样,如果调用对象(对于wait())没有被授予锁定,就像通过调用对象上的sychronizing一样,它会引发IllegalMonitorStateException。以编程方式检查锁是否被授予?

我想知道

像wait()方法,才能确保锁被授予,通过编写一些代码? 还是仅由JVM完成?

回答

4

只要写:

synchronized (thing) { 
    thing.wait(); 
} 

如果它不是已经锁定,这将被锁定,如果它已被锁定,那么它的罚款。

+0

这是一个很糟糕的问题:) – bestsss 2011-01-27 10:03:39

0

我不知道Java,但通常的锁语义是当你试图获得一个锁时,你会阻塞,直到你得到它。这意味着不需要验证您是否真的获得了锁定 - 当流程到达下一行时,您可以确定您已锁定。当你开始试图用锁来做其他事情时,比如试图检查它是否被锁定,你通常做错了。

+0

只是我想知道我们如何检查? – ajduke 2011-01-27 09:40:38

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

+0

好的..是concurrncy库是Thread类还是别的?你可以请精巧吗? – ajduke 2011-01-27 09:46:46

相关问题