美文网首页
使用Condition实现等待/通知

使用Condition实现等待/通知

作者: 迷糊小生 | 来源:发表于2019-04-01 22:37 被阅读0次

关键字synchronized与wait()和notify()/notifyAll()方法相结合可以实现等待/通知模式,类ReentrantLock也可以实现同样的功能,但需要借助于Condition对象。

Condition类具有很好的灵活性,可以实现多路通知功能,也就是在一个Lock对象里面可以创建多个Condition(即对象监视器)实例,线程对象可以注册在指定的Condition中,从而可以有选择性地进行线程通知,在调度线程上更加灵活。

在使用notify()/notifyAll()方法进行通知时,被通知的线程却是由JVM随机选择的。但是使用ReentrantLock结合Condition类是可以实现前面介绍过的“选择性通知”

而synchronized就相当于整个Lock对象中只有一个单一的Condition对象,所有的线程都注册在它的一个对象身上。线程开始notifyAll()时,需要通知所有WAITING线程,没有选择权,会出现相当大的效率问题。

package other.thread15;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class DemoService {
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    
    public void await() {
        try {
            lock.lock();
            System.out.println("await时间为:" + System.currentTimeMillis());
            condition.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
    
    public void signal() {
        try {
            lock.lock();
            System.out.println("signal时间为:" + System.currentTimeMillis());
            condition.signal();
        }finally {
            lock.unlock();
        }
    }
}
package other.thread15;

public class ThreadA extends Thread {

    private DemoService service;
    
    public ThreadA(DemoService service) {
        this.service = service;
    }
    
    @Override
    public void run() {
        service.await();
    }
}
package other.thread15;

public class Test {

    public static void main(String[] args) throws InterruptedException {
        DemoService service = new DemoService();
        ThreadA threadA = new ThreadA(service);
        threadA.start();
        Thread.sleep(1000);
        service.signal();
    }

}
image.png

成功实现等待/通知模式
Object类中的wait()相当于Condition类中的await()方法。
Object类中的wait(long timeout)相当于Condtion类中的await(long time,TimeUnit unit)方法。
Object类中的notify()方法相当于Condition类中的signal()方法。
Object类中的notifyAll()方法相当于Condition类中的signalAll()方法。

相关文章

  • 使用Condition实现等待/通知

    关键字synchronized与wait()和notify()/notifyAll()方法相结合可以实现等待/通知...

  • Condition

    Condition 实现管程里面的条件变量 Lock和Condition实现的管程,线程等待和通知需要调用awai...

  • 如何理解Condition

    在jdk1.5以后并发包中提供了Lock接口,Condition接口与Lock配合使用可以实现等待/通知模式,在此...

  • Condition等待通知

    如果你知道经典的生产消费模式(wait,notify实现),那么这篇文章你应该能够轻松地阅读理解。Conditio...

  • 线程的等待与通知,如何使用Condition实现?

    线程的等待与通知,目的就是为了实现线程间的协作,那一般情况下,我们最容易想到的方式是使用循环以及公共变量,比如: ...

  • ReentrantLock用法

    ReentrantLock实现同步锁 结果: Condition等待/唤醒 结果: 多个Condition实现部分...

  • 8. 并发终结之Condition条件变量

    Condition接口作为wait/notify的替代品来实现等待/通知,很好的解决了过早唤醒的问题,并且bool...

  • 再谈ReentrantLock之2

    Condition Lock的等待通知机制,一般这么用: 等待: 通知: await 1.将线程加入到等待队列 先...

  • 显示锁 Condition

    1、Object提供的等待通知方法 2、显示锁提供的等待通知 3、区别 4、源码 Condition.await(...

  • AQS 之 Condition-的源码分析

    在使用 Lock 锁的过程中,我们往往会使用到另外一个对象 Condition ,用于等待/通知模式的处理。 Co...

网友评论

      本文标题:使用Condition实现等待/通知

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