wait,notify,notifyAll,sleep这些方法都跟线程的状态变化有关,为什么jdk把前三个方法放在Object类里面,而把sleep放在Thread类里面?

首先,虽然这些方法都跟线程的状态变化有关,但wait(),notify(),notifyAll()这三个方法在用法上就跟sleep()方法不太一样,wait(),notify(),notifyAll()必须在sychronized同步代码块中使用,且要用当前线程持有的锁来调用,比如锁.wait(),锁.notify(),而sleep()方法则是Thread类的一个静态方法,直接通过Thread类调用即可。

复习一下这几个方法的作用,wait方法的作用是让获得了锁的线程释放锁,并且把该线程放在这个对象锁的等待池中,请注意,是当前这个对象锁,而不是该线程拥有的其他对象锁(一个线程可以拥有多个对象锁),此时该线程状态会变为waiting;而notify是把该对象锁的等待池中其中一个线程(随机一个)放到锁池中,notifyAll则是把该对象锁的等待池中的线程全部放到锁池中;调用seelp方法会把线程的状态变成timed_waiting,但并不会释放锁。

知道上面这些后,其实就很容易理解为什么jdk把wait,notify,notifyAll放在Object类里面,而把sleep放在Thread类里面了。我觉得有两个原因:

1.在java的内置锁机制中,每个对象都可以成为锁,也就是说每个对象都可以去调用wait,notify方法,而Object类是所有类的一个父类,把这些方法放在Object中,则java中的所有对象都可以去调用这些方法了。

2.一个线程可以拥有多个对象锁,wait,notify,notifyAll跟对象锁之间是有一个绑定关系的,比如你用对象锁aObject调用的wait()方法,那么你只能通过aObject.notify()或者aObject.notifyAll()来唤醒这个线程,这样jvm很容易就知道应该从哪个对象锁的等待池中去唤醒线程,假如用Thread.wait(),Thread.notify(),Thread.notifyAll()来调用,虚拟机根本就不知道需要操作的对象锁是哪一个。

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页