为什么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类的方法