java - 监视器和锁问题

标签 java concurrency

如果线程 A 访问线程 B 的方法,而该方法恰好正在等待某个条件,那么线程 A 会卡在该方法中吗?我怎样才能让线程 A 实际上检查线程 B 是否正在等待条件,因此也被条件挂起,并在完成时收到线程 B 条件的信号?

基本上,我想知道如何防止嵌套条件阻止调用嵌套调用(线程间)的父方法。

例如:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Person {

   final Lock lock = new ReentrantLock();
   Condition isFree = lock.newCondition();
   State state;

   public void eat() throws InterruptedException {
      lock.lock();
      try {
         while (state != State.WAITING) {
            isFree.await();
         }

         //begin eating
         state = State.EATING;
         Thread.sleep(1000);
         state = State.WAITING;
         isFree.signal();

      } finally {
         lock.unlock();
      }
   }

   public void feed(Person person) throws InterruptedException {
      lock.lock();
      try {

         while (state != State.WAITING) {
            isFree.await();
         }

         //begin intention to feed
         person.eat();

      } finally {
         lock.unlock();
      }
   }

   enum State {
      EATING, WAITING;
   }
}

在上面的示例中,可能会发生每个 Person 对象都在喂养另一个对象,因此陷入竞争状态。

谢谢!

最佳答案

看看 tryLock() java.util.concurrent.locks.Lock 上的方法。这允许您尝试获取锁,但如果失败则返回(在可选的超时之后),而不是阻塞。

关于java - 监视器和锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5214579/

相关文章:

java - 如何在 Java 中确定给定日期前一天的日期?

java - 如何将 FileInputStream 获取到 Assets 文件夹中的文件

java - Android/Java - 从另一个文件调用 RingtoneManager 实例方法

haskell - 可靠地等待多个异步?

Java缓存线程池和线程本地

multithreading - 没有并发怎么能有并行呢?

java - Spring Security 找不到数据源

git - `git remote add --mirror=fetch` 会与 `git clone --mirror` 制作相同的仓库吗?

c++ - std::atomic::load 如何实现

clojure uberjar 在 openjdk 上运行时抛出错误