Java—多线程9 Condition的await和signal机制

Java—多线程9 Condition的await和signal机制

##两种机制等待队列的对比

1.Object的wait和notify是与内建锁(对象监视器)搭配使用,完成线程的等待与通知机制。本地方法实现。

2.Condition的await、signal是与Lock体系配合实现线程的等待与通知,Java语言层面的实现,具有更高的控制与扩展性

Condition机制有一下三个独有特性:

1.Condition支持不响应中断,而Object类提供的wait不支持。

2.Condition支持多个等待队列,而Object wait只有一个等待队列。

3.Condition支持设置解锁时间,而Object,wait只支持设置超时时间。

Condition

await方法

public final void await() throws InterruptedException (同wait()方法)
public final void awaitUninterruptibly() 等待过程中不响应中断
public final boolean await(long time, TimeUnit unit) 在I的基础上增加了超时等待功能,可以自定义时间单位
public final boolean awaitUntil(Date deadline) throws InterruptedException 特性3,支持设置截止时间

Condition等待队列

Condition队列与AQS中的同步队列共享结点(Node)数据结构。带有头尾指针的单向队列。

获取:

1.先要获取一个Lock实例对象。

2.获取与Lock绑定的Condition对象。

3.每当调用lock.newCondition()就会在Lock锁上新增一个等待队列。(特性2)

**应用场景:**使用Condition实现有界队列,当队列为空时队列的获取(删除)操作会阻塞获取(删除)线程,知道队列中新增元素;当队列已满时,队列的插入操作会阻塞插入线程,知道队列出现空位

await实现原理

public final void await() throws InterruptedException {
   
    //响应中断
    if (Thread.interrupted())
        throw new InterruptedException();
    //将线程封装为Node入等待队列
    Node node = addConditionWaiter();
    //释放拿到的同步状态
    long savedState = fullyRelease(node);
    int interruptMode = 0;
    //
    while (!isOnSyncQueue(node
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值