像在wait()方法中一样,如果调用对象(对于wait())没有被授予锁定,就像通过调用对象上的sychronizing一样,它会引发IllegalMonitorStateException。以编程方式检查锁是否被授予?
我想知道
像wait()方法,才能确保锁被授予,通过编写一些代码? 还是仅由JVM完成?
像在wait()方法中一样,如果调用对象(对于wait())没有被授予锁定,就像通过调用对象上的sychronizing一样,它会引发IllegalMonitorStateException。以编程方式检查锁是否被授予?
我想知道
像wait()方法,才能确保锁被授予,通过编写一些代码? 还是仅由JVM完成?
只要写:
synchronized (thing) {
thing.wait();
}
如果它不是已经锁定,这将被锁定,如果它已被锁定,那么它的罚款。
我不知道Java,但通常的锁语义是当你试图获得一个锁时,你会阻塞,直到你得到它。这意味着不需要验证您是否真的获得了锁定 - 当流程到达下一行时,您可以确定您已锁定。当你开始试图用锁来做其他事情时,比如试图检查它是否被锁定,你通常做错了。
只是我想知道我们如何检查? – ajduke 2011-01-27 09:40:38
你可以拨打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
好的..是concurrncy库是Thread类还是别的?你可以请精巧吗? – ajduke 2011-01-27 09:46:46
这是一个很糟糕的问题:) – bestsss 2011-01-27 10:03:39