zoukankan      html  css  js  c++  java
  • Condition

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

    1. 一是基于wait/notify方法结合synchronized关键字来实现
    2. 二是Condition结合Lock来实现
    • Condition理解为条件队列
    • Condition是在java1.5才出现。它用来替换传统的 wait(), notify()实现线程之间的协作,但是更加强大。
    • Condition用 await(), signal, signalAll方法替代wait(), notify()。假如用wait,notify,有三个线程调用一个对象的某个方法,notify只能随机的唤醒一个线程,而不能指定唤醒某个线程,但是用condition就可以唤醒指定的线程
    • condition也被用来实现阻塞队列。
    • condition是通过lock锁创建出来的,依赖于lock对象,基本代码是 ReentrantLock.newCondition()
    • 调用await方法后,将当前线程加入Condition等待队列中。当前线程释放锁。否则别的线程就无法拿到锁而发生死锁。自旋(while)挂起,不断检测节点是否在同步队列中了,如果是则尝试获取锁,否则挂起。当线程被signal方法唤醒,被唤醒的线程将从await()方法中的while循环中退出来,然后调用acquireQueued()方法竞争同步状态。
    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();
        }
    }
    

    Q - java多线程多消费者-多生产者模式 2condition是否可以使用while而不是if的问题?

    A - 
    1、假设2个消费者2个生产者,试想下面情况 消费者1进入被阻塞生产者1进入 生产完毕并唤醒消费者1 此时消费者2进入,消费者1虽然被唤醒但并没有抢到cpu,消费者2消费完毕唤醒(此时没有生产者被唤醒) 此时如果消费者1能够抢赢生产者2则就会出现空消费的问题,所以需要while再次判断。 
    2、存在虚假唤醒,所以需要重新循环判断

  • 相关阅读:
    《程序员的数学课》模块二 代数与统计
    《程序员的数学课》模块一 无处不在的数学思维03
    Java 接口重试的几种实现
    用过stopwatch(秒表)观察代码运行的时长吗?
    sql 面试必刷系列-case-when
    缓存穿透、缓存击穿和缓存雪崩,了解一下?
    数据库批量插入100W 条数据,你学废了吗?
    缓冲输入流
    Linux系统中内存问题排查思路与解决方法
    Linux系统中负载较高问题排查思路与解决方法
  • 原文地址:https://www.cnblogs.com/xhyouyou/p/12465301.html
Copyright © 2011-2022 走看看