2016-01-02 2 views
6

У меня есть класс, который похож на это:Как метод, ожидающий освобождения блокировки?

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, но это рядом с точкой. Есть ли способ улучшить такой код, чтобы не тратить ресурсы времени (например, ненужные переключатели потоков)?

+0

Может быть, [это] (http://stackoverflow.com/questions/6584355/how-does-the-synchronize-functionnality-work-in-java) может помочь – MadProgrammer

ответ

2

ли занят ждет

No.

ли выход ожидания нити, так что другие потоки (как один делает вычисление) можно продолжить.

Нет, он блокирует, так что другие потоки могут работать.

Занимает ли ожидание поток спать?

Он заблокирован.

Ожидание/уведомление вызвано за сценой?

No.

+0

Если призвании поток будет периодически получать слот, где он может попытаться получить блокировку. Это означает, что возможно, что некоторое время может пройти между выпуском «блокировки» из расчета и повторной блокировкой «блокировки» для извлечения данных. Это верно? – hotzst

+0

На самом деле используется какой-то механизм 'wait/notify', но это механизм низкого уровня, который использует функциональность ОС. Таким образом, поток официанта блокируется, пока не произойдет событие из предопределенного набора. Блокировка освобождения (в другом потоке) является одним из таких событий, и после этого события поток официанта сразу получает доступ для планирования. – Tsyvarev

Смежные вопросы