/** main lock guarding all access **/
final reentrantlock lock;
/** condition for waiting takes **/
private final condition notempty;
/** condition for waiting puts **/
private final condition notfull;
causes the current thread to wait until it is signalled or interrupted.
the lock associated with this condition is atomically released and the current thread becomes disabled for thread scheduling purposes and lies dormant until one of four things happens......
in all cases, before this method can return the current thread must re-acquire the lock associated with this condition. when the thread returns it is guaranteed to hold this lock.