2012-09-13 5 views
0

Этот фрагмент кода из Java-параллелизма на практике, я действительно не понимаю.java параллелизм на практике 14.6

@ThreadSafe 
public class BoundedBuffer<V> extends BaseBoundedBuffer<V> { 
    // CONDITION PREDICATE: not-full (!isFull()) 
    // CONDITION PREDICATE: not-empty (!isEmpty()) 

    public BoundedBuffer(int size) { super(size); } 

    // BLOCKS-UNTIL: not-full 
    public synchronized void put(V v) throws InterruptedException { 
     while (isFull()) 
      wait(); 
     doPut(v); 
     notifyAll(); 
    } 

    // BLOCKS-UNTIL: not-empty 
    public dsynchronize V take() throws InterruptedException { 
     while (isEmpty()) 
      wait(); 
     V v = doTake(); 
     notifyAll(); 
     return v; 
    } 
} 

методы ввода и приема синхронизированы. Если какой-то поток ждет в методе put, никто не может когда-либо вводить метод take или put. Поэтому в большинстве случаев, если поток начинает ждать, он будет ждать всегда.

Я что-то не понимаю?

ответ

3

Это synchronized, но метод wait() освободил замок, если он ждет - вот как он работает. Затем поток блокируется до тех пор, пока он не будет уведомлен. Как только он уведомляется, он снова блокирует и продолжает. Процитируем Object.wait() Javadocs:

Вызывает текущий поток ждать, пока другой поток не вызывает метод java.lang.Object.notify() или метод java.lang.Object.notifyAll() для этого объекта. Другими словами, этот метод ведет себя точно так, как если бы он просто выполнял ожидание вызова (0).

Текущий поток должен принадлежать этому объекту. Нить освобождает владельца этого монитора и ждет, пока другой поток не сообщит потокам, ожидающим на мониторе этого объекта, просыпаться либо через вызов метода уведомления, либо метод notifyAll. Затем поток ожидает, пока он не сможет повторно получить право собственности на монитор и возобновит выполнение.

Я бы порекомендовал немного больше узнать о Java concurrency, в частности, этот раздел на guarded blocked.

Более типично указать, какой объект вы ожидаете и уведомляете. Вызов wait() действительно должен быть this.wait() и this.notifyAll(), что упрощает определение того, какая блокировка затронута.

+0

Извините, для этого вопроса новичка. –

+0

Np чувак. Просто убедитесь, что вы прочитали документы о потоке. Вы будете смущены, и в противном случае это будет труднее. – Gray

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