У меня есть класс, который похож на это:Как метод, ожидающий освобождения блокировки?
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();
}
}
}
Этот класс делает некоторые дорогие (TimeWise) расчеты и получает блокировку. Пока блокировка не используется, никто не может получить данные, которые будут обновляться путем вычисления, поэтому они должны дождаться завершения вычисления. Фактический расчет выполняется в отдельном потоке. Если у меня есть следующий код:
ExpensiveCalculation calculation = ...
calculation.calculate();
Object data = calculation.getData();
вызов для получения данных блокируется, пока расчет не производится. Что именно ожидание в этот момент означает?
- ли занят ждет
- ли выход ожидающего потока, так что другие потоки (например, один делает вычисление) может продолжиться.
- Засыпает ли ожидающая нить?
- Ожидание/уведомление вызвано за сценой?
Я знаю, что для этого примера я мог бы использовать Callable
и Future
, но это рядом с точкой. Есть ли способ улучшить такой код, чтобы не тратить ресурсы времени (например, ненужные переключатели потоков)?
Может быть, [это] (http://stackoverflow.com/questions/6584355/how-does-the-synchronize-functionnality-work-in-java) может помочь – MadProgrammer