美文网首页
重入锁的搭档:Condition

重入锁的搭档:Condition

作者: 12点前睡觉hhh | 来源:发表于2019-05-30 14:10 被阅读0次

    Condition的作用和obj.wait和obj.notify的作用大致相同。只不过wait和notify方法和synchronized关键字合作使用,而Condition是与重入锁相关联的。
    通过ReentrantLock.newCondition方法可以生成一个与当前重入锁绑定的Condition实例对象,利用Condition对象,我们可以让线程在合适的时间等待,或者在某一时刻得到通知继续执行。
    Condition接口提供的方法如下:

     void await() throws InterruptedException;
     void awaitUninterruptibly();
     long awaitNanos(long nanosTimeout) throws InterruptedException;
     boolean await(long time, TimeUnit unit) throws InterruptedException;
     boolean awaitUntil(Date deadline) throws InterruptedException;
     void signal();
     void signalAll();
    

    await()会使当前线程等待,同时释放当前锁。当其他线程调用signal方法或者signalAll方法时,线程会重新获得锁并继续执行。或者当前线程被中断时,也能跳出等待。与obj.wait方法相似。
    awaitUninterruptibly()与await()方法相似,当时他不会在等待过程中响应中断。
    使用实例:

    public class ConditionDemo implements Runnable{
        private static ReentrantLock lock=new ReentrantLock();
        private static Condition condition=lock.newCondition();
    
        @Override
        public void run() {
            try {
                lock.lock();
                condition.await();
                System.out.println("Thread is await");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            Thread t1=new Thread(new ConditionDemo());
            t1.start();
            Thread.sleep(1000);
            lock.lock();
            condition.signalAll();
            lock.unlock();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:重入锁的搭档:Condition

          本文链接:https://www.haomeiwen.com/subject/mkomtctx.html