java 中的 Condition 条件对象学习小记

Condition介绍

在这里插入图片描述
condition用 await(), signal, signalAll方法替代Object 中的 wait(), notify()
condition的await,signal和 wait,notify都需要在锁之间运行
contidion也被用来实现阻塞队列
condition是通过锁创建出来的。基本代码是 ReentrantLock.newCondition()
在这里插入图片描述

Condition 的作用

当线程1需要等待某个条件的时候,它就去执行condition.await()方法,一旦执行了await()方法,线程就会进入阻塞状态,然后通常会有另外一个线程,假设是线程2,去执行对应的条件,直到这个条件达成的时候,线程2就会去执行condition.signal()方法,这时JVM就会从被阻塞的线程里找,找到那些等待该condition的线程,当线程1就会收到可执行信号的时候,它的线程状态就会变成Runnable可执行状态 。

signalAll() 和 signal 的区别

signalAll()会唤起所有的正在等待的线程,但是signal0是公平的,只会唤起那个等待时间最长的线程 。

public class ConditionDemo {
    public static void main(String[] args) throws InterruptedException {
        ReentrantLock reentrantLock = new ReentrantLock();
        Condition condition = reentrantLock.newCondition();

        String waitThread = "waitThread";
        new Thread(() -> {
            reentrantLock.lock();
            try {
                System.out.println(Thread.currentThread().getName() + "  开始等待 ...");
                condition.await();
                System.out.println(Thread.currentThread().getName() + " 被唤醒, 运行结束 ...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                reentrantLock.unlock();
            }

        }, waitThread).start();

        // 阻塞30 毫秒, 主线程先获得锁
        Thread.sleep(30);

        reentrantLock.lock();
        System.out.println("三秒以后开始唤醒 " + waitThread + " 线程");
        try {
            Thread.sleep(3000);
            condition.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            reentrantLock.unlock();
        }
    }
}

运行结果
在这里插入图片描述

Condition的注意点

  1. 实际上,如果说Lock用来代替synchronized,那么Condition就是用来代替相对应的Object.wait/notify的,所以在用法和性质上,几乎都一样
  2. await方法会自动释放持有的Lock锁,和Object.wait一样,不需要自己手动先释放锁
  3. 调用await的时候,必须持有锁,否则会抛出异常,和Object.wait一样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值