JAVA Condition

等待通知机制,在Java中主要有两种方式:

  • 一是基于wait/notify方法结合synchronized关键字来实现
  • 二是Condition结合Lock来实现

Condition的示例:
Condition接口定义了等待/通知两种类型的方法,在线程调用这些方法时,需要提前获取Condition对象关联的锁(在基于wait/notify方法实现的方案中需要获取的是对象锁)。

Condition对象是需要关联Lock对象的,调用Lock对象的newCondition()对象创建而来,也就是说Condition的使用是需要依赖Lock对象的。

    private Lock lock = new ReentrantLock();

    private Condition condition = lock.newCondition();
 
    public void conditionAwait() throws InterruptedException {
        lock.lock();
        try {
            condition.await();
        } finally {
            lock.unlock();
        }
    }
 
    public void conditionSignal() {
        lock.lock();
        try {
            condition.signal();//condition.signalAll();
        } finally {
            lock.unlock();
        }
    }

常用的方法:
await():当前线程进入等待状态直到被通知(signal)或中断;

当前线程进入运行状态并从await()方法返回的场景包括:
(1)其他线程调用相同Condition对象的signal/signalAll方法,并且当前线程被唤醒;
(2)其他线程调用interrupt方法中断当前线程;

signal():
唤醒一个等待在Condition上的线程,被唤醒的线程在方法返回前必须获得与Condition对象关联的锁

Condition-线程通信更高效的方式

借助于Condition对象,RetrantLock可以实现类似于Object的wait和notify/notifyAll功能。使用它具有更好的灵活性。
在一个Lock对象里面可以创建多个Condition(对象监视器)实例,线程对象可以注册在指定的Condition对象中,从而可以有选择性的进行线程通知,实现多路通知功能,在调度线程上更加灵活。

见上一篇中的ArrayBlockingQueue<E>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 接着上节 atomic,本节主要介绍condition_varible的内容,练习代码地址。本文参考http://...
    jorion阅读 8,539评论 0 7
  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 11,319评论 4 56
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    胜浩_ae28阅读 5,137评论 0 23
  • 我跟我的好朋友吵架有蛮多天了,两个人一直没有理会对方。她前些天跟我说她在学车,我说她那里车多路窄,其实本意是想说开...
    豆豆掌门阅读 5,166评论 5 4
  • 清晨起来,带着绝望,带着决绝,眼角挂着昨晚嘶声力竭后的眼泪。 不知道怎么表述心情,是恐慌还是庆幸, 当冒着一身的冷...
    兰芷夭夭阅读 262评论 0 0