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()来调用,虚拟机根本就不知道需要操作的对象锁是哪一个。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值