2013-02-12 2 views
3

Я читал около Condition объектов и как они предлагают несколько наборов ожидания для каждого объекта, а также различают, какой объект или группа объектов/потоков получает конкретный сигнал.
Почему нет обычного Object? Например.Условия vs objects wait/notify

Вместо:

final Condition notFull = lock.newCondition(); 
final Condition notEmpty = lock.newCondition();  

lock.lock(); 
try { 
    while (count == items.length) 
    notFull.await(); 
    items[putptr] = x; 
    if (++putptr == items.length) putptr = 0; 
     ++count; 
    notEmpty.signal(); 

Мы делаем это:

final Object notFull = new Object();  
final Object notEmpty = new Object();  

lock.lock(); 
try { 
    while (count == items.length) 
    notFull.wait(); 
    items[putptr] = x; 
    if (++putptr == items.length) putptr = 0; 
     ++count; 
    notEmpty.notify(); 

Не у нас еще есть несколько наборов ожидания и различать среди заявленных потоков?

ответ

1

Перед тем как позвонить wait или notify, необходимо позвонить по телефону synchronize. Когда вам нужны два разных набора, вам нужно два объекта для синхронизации. Вложенная синхронизация даст вам взаимоблокировки.

+0

Но с условием мне все равно нужны объекты 'Condition' – Jim

+1

Два условия в порядке, если вам нужно заблокировать только один объект блокировки, а не два разных замка. Это то, что вы не можете сделать с мониторами. –

+0

Здесь довольно много вопросов и ответов. См. Http://stackoverflow.com/questions/3190545/java-wait-notify-and-synchronized-blocks и http://stackoverflow.com/questions/2779484/why-wait-should-always-be-in-synchronized -блочный, для eaxmple. –

0

Это не нормально. У вас должен быть собственный монитор объекта, чтобы использовать его метод notFull.wait(). Даже если бы это было разрешено, он все равно не выпустил бы lock, поэтому ни один другой поток не смог бы получить к нему доступ.

3

В вашем примере вы создали 2 условия на одном замке. Это то, что вы не можете сделать со встроенной синхронизацией - вам нужно было использовать 2 объекта, чтобы получить 2 условия.

И ваш второй код сломан, потому что вы не получили блокировку на notFull и notEmpty, но вызываете wait/notify - вы получите IllegalMonitorStateException. Но если вы попытаетесь заблокировать их обоих, вы увидите, что вы не можете сделать это одновременно. Это разность

+0

Значит, это просто «сохранение» объектов? – Jim

+0

Нет, он избегает тупика, вызванного необходимостью приобретать два разных монитора во вложенных синхронизированных блоках. –

+0

@ RalfH: «тупик в вложенной синхронизации». Можно ли привести пример этого? – Jim

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