问二十:说说notify和notifyAll的区别?

本文介绍了synchronized底层实现monitor的两个字段EntryList和WaitSet。锁池(EntryList)是线程等待对象锁释放的地方,等待池(WaitSet)是调用wait()方法后线程释放锁并进入的地方。还说明了notify和notifyAll对等待池线程的唤醒区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

synchronized的底层实现monitor它有两个字段:EntryListWaitSet

 

锁池(EntryList)

如果线程A拥有了某个对象的锁的话,其他线程B、C想调用这个对象的synchronized方法(或者进入方法块)的话,就必须获得该对象锁的拥有权。

而这时该对象的锁被线程A锁占用,因此B、C线程就会被阻塞,进入到一个地方等待锁的释放,这个地方就是锁池。

等待池(WaitSet)

假设线程A调用了某个对象的wai()方法,线程A就会释放该对象的锁,同时线程A就进入到该对象的等待池中,具体来说就是monitor锁中的WaitSet中,并且进入等待池的线程都不会去竞争该对象的锁。

区别:

notify和notifyAll的作用就是在某个线程调用了wait()方法之后,对等待池中的这些线程进行一个唤醒操作,区别就是

notify只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会

notifyAll会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值