2013-10-05 4 views
0

Рассмотрим следующие утверждения исполнения:Java: Вечно ждет THEAD

(1) Тема A: Чеки для конкретного состояния блокировки и не (2) Тема A: Поэтому пытается идти в состояние ожидания (3) Thread B: Выполнено с конкретной задачей и изменено состояние блокировки, которое требуется по потоку A (4) Резьба B: Сигналы notifyAll()

Рассмотрите, должна ли виртуальная машина Java переупорядочить код для выполнения в следующем порядке (1), (3), (4), (2). Я считаю, что такое условие возможно, и в таком случае может возникнуть проблема, потому что Thread A ожидает состояния ожидания навсегда, так как нет другого потока для уведомления!

EDIT 1: Я не использую синхронизированный блок с целью блокировки. Скорее я использую AtomicInteger, чтобы получить блокировку кода. Рассмотрим класс RWLock и он имеет атомную переменную N. С увеличением числа или считыванием числа считывателей и писателей, входящих в состояние блокировки. Вопрос применим к такому условию, а не к синхронизированным блокам/методам.

+0

Вот почему вам нужно удерживать блокировку объекта для вызова ждать или уведомить об этом. Это делает вашу последовательность невозможной. Если я не понял правильно, отправьте код, который иллюстрирует ваш вопрос. –

+0

Я внес некоторые изменения. Если вам нужна дополнительная информация, пожалуйста, спросите. –

ответ

1

Если вы используете шаблон wait()/notifyAll(), тогда вы должны синхронизировать объект блокировки с обоими вызовами. Это предотвращает повторный заказ, который вы предлагаете.

Например

private final Object lock = new Object(); 

public void waiting() 
{ 
    sychronized (lock) 
    { 
    while (waitCondition) 
     lock.wait(); 
    } 
} 

public void notifying() 
{ 
    sychronized (lock) 
    { 
    // change wait condition, probably 

    lock.notifyAll(); 
    } 
} 
+0

Я не использую синхронизированные блоки. Я использую Atomic Integer для применения блокировок. Извините, я должен был указать это в своем посте. –