Condition

Condition是Object里面的wait、notify、notifyAll方法的一个替换
Where a Lock replaces the use of synchronized methods and statements, a Condition replaces the use of the Object monitor methods.
锁(Lock)替换了synchronized 方法和synchronized 代码块,条件(Condition)替换了Object类里面的监视器方法如:wait、notify、notifyAll

Condition的await或者signal方法必须在持有锁的时候调用,即在lock.lock()及lock.unlock()之间调用

如果当前线程没有持有锁就去调用Condition的await或者signal方法,将抛出一个IllegalMonitorStateException异常

class BoundedBuffer {
     final Lock lock = new ReentrantLock();
     final Condition notFull  = lock.newCondition(); 
     final Condition notEmpty = lock.newCondition(); 
  
     final Object[] items = new Object[100];
     int putptr, takeptr, count;
  
     public void put(Object x) throws InterruptedException {
       lock.lock();
       try {
         while (count == items.length)
           notFull.await();
         items[putptr] = x;
         if (++putptr == items.length) putptr = 0;
         ++count;
         notEmpty.signal();
       } finally {
         lock.unlock();
       }
     }
  
     public Object take() throws InterruptedException {
       lock.lock();
       try {
         while (count == 0)
           notEmpty.await();
         Object x = items[takeptr];
         if (++takeptr == items.length) takeptr = 0;
         --count;
         notFull.signal();
         return x;
       } finally {
         lock.unlock();
       }
     }
   }

await方法:进入等待状态

Causes the current thread to wait until it is signalled or interrupted.
调用该方法将会使当前线程进入等待状态,知道收到signal信号或者被中断。
如果一个线程进入wait状态,如下情况能够唤醒:
一、其他线程调用了signal方法、并且当前线程正好被选中唤醒。
二、其他线程调用了signalAll方法。
三、其他线程中断了( interrupts)当前线程。
四、发生了伪唤醒。
不管发生上面的哪一种情况,当前线程都需要重新获取锁。

awaitNanos方法:等待指定时间

awaitUninterruptibly方法:进入等待状态,interrupt对这个等待无效,忽略中断请求

signal方法:唤醒等待线程中的其中一个

signalAll方法:唤醒所有正在等待的线程

上一篇:数据库相关


下一篇:租用虚拟主机应注意什么?