该方法如何等待锁定被释放?

时间:2016-01-02 08:46:34

标签: java multithreading synchronization

我有一个与此类似的课程:

public class ExpensiveCalculation {
  private Executor threadExecutor = ...
  private Object lock = new Object();

  private Object data = null;

  public Object getData() {
    synchronized(lock) {
      return data;
    }
  }

  pulic void calculate() {
    executor.execute(() -> internalCalculation());
  }
  private void internalCalculation() {
    synchronized(lock) {
      // do some long running calculation that in the end updates data
      data = new Object();
    }
  }
}

此类进行一些昂贵的(按时间)计算并获取锁定。当锁定被保持时,没有人可以检索将由计算更新的数据,因此实际上它们必须等待计算完成。实际计算是在一个单独的线程中完成的。 如果我有以下代码:

ExpensiveCalculation calculation = ...
calculation.calculate();
Object data = calculation.getData();

在计算完成之前,将阻止检索数据的调用。在这一点上等待的究竟是什么意思?

  • 这是一个忙碌的等待
  • 等待线程是否会产生,因此其他线程(如进行计算的线程)可以继续。
  • 等待线程是否会进入休眠状态?
  • 是否在场景后面调用了wait / notify?

我知道,对于此示例,我可以使用CallableFuture,但这不是重点。有没有办法改进这样的代码,以确保不浪费时间资源(如不必要的线程切换)?

1 个答案:

答案 0 :(得分:2)

  

这是一个忙碌的等待

没有

  

等待线程是否会产生,因此其他线程(如进行计算的线程)可以继续。

不,它会阻塞,以便其他线程可以运行。

  

等待线程是否会进入休眠状态?

被阻止。

  

是否在场景后面调用了wait / notify?

没有