博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么notify(), wait()等函数定义在Object中,而不是Thread中
阅读量:5924 次
发布时间:2019-06-19

本文共 635 字,大约阅读时间需要 2 分钟。

Object中的wait(), notify()等函数,和synchronized一样,会对“对象的同步锁”进行操作。

wait()会使“当前线程”等待,因为线程进入等待状态,所以线程应该释放它锁持有的“同步锁”,否则其它线程获取不到该“同步锁”而无法运行!

OK,线程调用wait()之后,会释放它锁持有的“同步锁”;而且,根据前面的介绍,我们知道:等待线程可以被notify()或notifyAll()唤醒。现在,请思考一个问题:notify()是依据什么唤醒等待线程的?或者说,wait()等待线程和notify()之间是通过什么关联起来的?答案是:依据“对象的同步锁”。

负责唤醒等待线程的那个线程(我们称为“唤醒线程”),它只有在获取“该对象的同步锁”(这里的同步锁必须和等待线程的同步锁是同一个),并且调用notify()或notifyAll()方法之后,才能唤醒等待线程。虽然,等待线程被唤醒;但是,它不能立刻执行,因为唤醒线程还持有“该对象的同步锁”。必须等到唤醒线程释放了“对象的同步锁”之后,等待线程才能获取到“对象的同步锁”进而继续运行。

总之,notify(), wait()依赖于“同步锁”,而“同步锁”是对象锁持有,并且每个对象有且仅有一个!这就是为什么notify(), wait()等函数定义在Object类,而不是Thread类中的原因。

转载于:https://www.cnblogs.com/MJyc/p/10383419.html

你可能感兴趣的文章
我的友情链接
查看>>
网络营销与电子商务
查看>>
powershell查看计算机最后登录时间
查看>>
IPSEC ×××实验二:ASA IPSEC ×××
查看>>
centos EMQTTD 集群安装配置与测试验证
查看>>
HC3i论坛医疗信息化资料30个
查看>>
lvs+keepalive 比较详细的安装配置文档
查看>>
什么是Gratuitous ARP
查看>>
Dynamic ARP Inspection(DAI)动态ARP检测
查看>>
业务表构建中一些特殊字符作为列名的构建示例
查看>>
oracle11gRAC环境使用RMAN备份方案
查看>>
JavaScript基础之程序流程的三大结构
查看>>
shell的详细介绍和编程(中)
查看>>
nginx+fastcgi+mono 环境搭建
查看>>
【2010强悍教程】一次性永远激活7290自带浏览器上网和彩信收发功能,不能上网的进。...
查看>>
【路由策略与策略路由的区别】
查看>>
vSphere HA
查看>>
tracertroute原理
查看>>
Mysql存储过程编写
查看>>
使用zabbix模板监控tomcat-解决模板部分监控项不生效问题
查看>>