我有一个类似于这样的类:
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吗?
我知道,对于这个例子,我可以使用Callable
和Future
,但这是重点.有没有办法改进这样的代码,以确保没有浪费时间资源(如不必要的线程切换)?