实践中的java并发14.6

时间:2012-09-13 04:54:14

标签: java multithreading concurrency

这段代码在实践中来自java并发,我真的不明白。

@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方法中等待,则没有人可以输入take或put方法,因此,在大多数情况下,如果线程开始等待,它将等待永远。

我想念一些事吗?

1 个答案:

答案 0 :(得分:3)

它是synchronizedwait()方法在等待时释放了锁 - 这就是它的工作原理。然后该线程将阻塞,直到通知为止。一旦通知它重新获取锁定并继续。引用Object.wait() javadocs:

  

使当前线程等待,直到另一个线程为此对象调用java.lang.Object.notify()方法或java.lang.Object.notifyAll()方法。换句话说,此方法的行为就像它只是执行call wait(0)一样。

     

当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后该线程等待,直到它可以重新获得监视器的所有权并继续执行。

我建议您更多地阅读有关Java concurrency的内容,特别是guarded blocked上的这一部分。

更典型的是,具体指定您正在等待和通知的对象。 wait()调用应该是this.wait()this.notifyAll(),这样可以更轻松地找出受影响的锁定。

相关问题