阅读580 返回首页    go 阿里云 go 技术社区[云栖]


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方法:唤醒所有正在等待的线程

最后更新:2017-04-01 17:04:39

  上一篇:go #内含福利#2T免费的云存储,能带我们飞多高?
  下一篇:go HBuilder打包Vue-cli构建的APP