【发布时间】:2019-04-15 21:49:09
【问题描述】:
根据Java doc,当obj1.wait() 发生时,“线程释放此监视器的所有权并等待直到另一个线程通知...”
因此,obj1 的锁被释放,而当前线程正在等待。但是所有其他锁呢?这段代码可能会锁定两个对象:
synchronized(obj2){
f1();
synchronized(obj1){
f2();
obj1.wait();
}
}
Obj2 不会被释放,但线程没有运行,另一个线程将徒劳地等待释放 obj2……我不明白 obj2 继续锁定的原因。但是,好的,它就是这样。
但是我怎样才能更好地组织这个等待,我怎样才能在等待所有或至少几个当前锁的时候解锁呢?
【问题讨论】:
-
我手边没有我的 JCIP 书,所以我不能说推荐的修复方法是什么,但我怀疑你必须手动退出所有同步块才能释放锁.
-
@markspace 根据docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait(),您正在为其调用wait() 的对象已被释放。无需离开。
-
除非
obj2似乎不会,所以这就是为什么您需要离开以释放锁定。 -
@markspace 是的,我对 obj2 感兴趣。那么,解决方案是不要在代码中使用 wait() ,由多个同步覆盖?没有 Locks 或 Futures 或其他帮助?也许使用 wait() 以外的其他方法会有所帮助?
标签: java multithreading