为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中,wait/notify和sleep方法的异同

为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中

因为java中每个对象都有一把称之为monitor监控器的锁
由于每个对象都可以上锁,这就要求在对象头中有一个用来保存锁信息的位置
这个锁是对象级别的,而非线程级别的,wait/notify/notifyAll也都是锁级别的操作,
他们的锁属于对象
所以把他们定义在Object类中最合适,因为Object类是所有对象的父类
因为如果把wait/notify/notifyAll方法定义在Thread类中,会带来很大的局限性
比如一个线程可能持有多把锁,以便实现相互配合的复杂逻辑,假设此时wait方法定义到Thread类中
如何实现让一个线程持有多把锁呢?又如何明确线程等待的是那把锁呢?
既然我们是让当前线程去等待某个对象的锁,自然应该通过操作对象来实现,而不是操作线程

wait/notify和sleep方法的异同

相同点
1.他们都可以让线程阻塞
2.它们都可以响应interrupt中断:在等待的过程中如果收到中断信号,都可以进行响应,
并抛出InterruptedException
不同点
1.wait方法必须在synchronized保护的代码中使用,而sleep方法并没有这个要求
2.在同步代码中执行sleep方法时,并不会释放monitor锁,但执行wait方法时会主动释放monitor锁
3.sleep方法中要求必须定义一个时间,时间到期后会主动恢复,而对于没有参数wait方法而言,意味着永久等待,直到被中断或者唤醒才能恢复,他并不会主动恢复
4.wait/notify是Object方法,而sleep是Thread类的方法
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值