java-wait()不会释放所有当前的锁,怎么办?

前端之家收集整理的这篇文章主要介绍了java-wait()不会释放所有当前的锁,怎么办? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

根据Java文档,当obj1.wait()发生时,“线程释放该监视器的所有权,并等待直到另一个线程通知…”

因此,当当前线程正在等待时,obj1的锁被释放.但是其他所有锁呢?代码段可能会锁定两个对象:

  1. synchronized(obj2){
  2. f1();
  3. synchronized(obj1){
  4. f2();
  5. obj1.wait();
  6. }
  7. }

Obj2将不会被释放,但是该线程不会运行,另一个线程将等待徒劳地释放obj2 …我不明白继续锁定obj2的原因.但是,好的,就是这样.

但是如何更好地组织这种等待,如何在等待所有或至少几个当前锁的时间内解锁?

最佳答案
您可以使用比同步语句更灵活的LockCondition.

对于您的示例,您可以将obj2替换为ReentrantLock:

  1. Lock lock2 = new ReentrantLock();
  2. try {
  3. // Blocks until the lock is acquired,just like a `synchronized` statement
  4. lock2.lock();
  5. f1();
  6. synchronized (obj1) {
  7. f2();
  8. lock2.unlock();
  9. obj1.wait();
  10. lock2.lock();
  11. }
  12. }
  13. // Use `finally` to make sure the lock is always released,even if an exception is thrown
  14. finally {
  15. // Exception might have been thrown before current thread could acquire lock again,cannot
  16. // unlock then
  17. if (lock2.isHeldByCurrentThread()) {
  18. lock2.unlock();
  19. }
  20. }

但是,这将允许另一个线程在当前线程开始等待obj1之前获取lock2.如果不希望这样,可以将obj1替换为Lock并等待obj2.

猜你在找的Java相关文章