多线程notify唤醒的是哪个对象(理解并发编程中的锁池)

 2025-04-21  阅读 877  评论 0

摘要:本文为小编原创文章,首发于Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注介绍锁池EntryList等待池WaitSet锁池假设线程A已经拥有了某个对象(不是类)的锁,而其他线程B,C想要调用这个对象的某个synchronized方法(或者块),由于B,C线程在进入

多线程notify唤醒的是哪个对象(理解并发编程中的锁池)(1)

本文为小编原创文章,首发于Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注

介绍

锁池EntryList

等待池WaitSet

多线程notify唤醒的是哪个对象(理解并发编程中的锁池)(2)

锁池

假设线程A已经拥有了某个对象(不是类)的锁,而其他线程B,C想要调用这个对象的某个synchronized方法(或者块),由于B,C线程在进入对象的synchronized方法(或者块)之前就必须先获得该对象锁的拥有权,而恰巧该对象的锁目前正被线程A所占用,此时B,C线程就会被阻塞,进入一个地方去等待锁的释放,这个地方便是该对象的锁池

等待池

假设线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁,同时线程A就进入到了该对象的等待池中,进入到等待池中的线程不会去竞争改对象的锁

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

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

多线程notify唤醒的是哪个对象(理解并发编程中的锁池)(3)

例子

我们用例子演示说明

开3个等待的线程,一个通知的线程,通知的线程里面调用notify方法

多线程notify唤醒的是哪个对象(理解并发编程中的锁池)(4)

看到只有一个线程结束了,其余2个线程一直阻塞。

thread2 wait thread3 wait thread1 wait thread2 notify

将notifyTask中的notify换成notifyAll,输入如下,可以看到3个线程都正常结束

thread1 wait thread2 wait thread3 wait thread3 notify thread2 notify thread1 notify

推荐阅读:

IDEA自动生成测试类,提升一半工作效率

年后面试必会基础,如何控制多线程执行顺序?

大家的理解是怎样的呢?欢迎交流探讨

,

版权声明:xxxxxxxxx;

原文链接:http://cn.tdroid.net/ce5abCz0HAQwAVl0.html

发表评论:

管理员

  • 内容265662
  • 积分0
  • 金币0
关于我们
lecms主程序为免费提供使用,使用者不得将本系统应用于任何形式的非法用途,由此产生的一切法律风险,需由使用者自行承担,与本站和开发者无关。一旦使用lecms,表示您即承认您已阅读、理解并同意受此条款的约束,并遵守所有相应法律和法规。
联系方式
电话:
地址:广东省中山市
Email:
注册登录
注册帐号
登录帐号

Copyright © 2022 太卓开发网 Inc. 保留所有权利。 泰达科技网易库网

页面耗时0.1023秒, 内存占用1.33 MB, 访问数据库18次