【JUC】wait/notify

原理

我之前写过sychronized的原理,讲到了monitor里的owner和entrylist。它还有一个waitset(类似于休息室)。
当owner里的线程长时间占用cpu,但是它不满足解锁的条件,于是可以调用wait()方法,于是进入waitset,状态也调整为waiting。而entrylist里blocked的线程就从此刻被唤醒,竞争owner。
当owner里的线程调用notify()的时候,waitset里waiting的线程被唤醒,进入entrylist重新竞争。

注意:wait()必须在有锁状态被调用
在这里插入图片描述
在这里插入图片描述
应该修改成
在这里插入图片描述

notify()和notifyAll()的区别

一个是在waitset中随机挑一个唤醒,一个是在waitset全部唤醒

sleep和wait的区别

  • sleep是thread方法,wait是obj方法
  • sleep随地可以调用,wait必须和synchronized一起调用(上面演示过了)
  • sleep不会释放锁,wait会释放锁。
    实例如下:
    用wait方法
    在这里插入图片描述
    看前面的时间,调用wait后锁立刻释放给main线程
    在这里插入图片描述
    反之,看sleep
    在这里插入图片描述
    结果是等待了10s后才释放锁。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值