剑指Offer(线程)——sleep和wait的区别以及notify和notifyAll的区别

sleep和wait

在源码中可以看出基本的差别:

  1. sleep是Thread类中的一个方法,wait是Object类中的一个方法;
  2. sleep()方法可以在任何地方使用;
  3. wait()方法只能在synchronized方法或者synchronized块中使用。

但是本质上的区别在于:

  1. Thread.sleep只是会让出CPU,但是不会导致锁行为的改变;
  2. Object.wait不仅是会让出CPU,还会释放已经占有的同步资源锁。

notify和notifyAll

notify和notifyAll都可以去唤醒正在等待的线程。

在Java虚拟机中运行程序的两个对象来说都存在两个池:锁池(EntryList)和等待池(WaitSet)

  1. 锁池(EntryList)

假设线程A已经拥有了某个对象(不是类)的锁,其他线程B、C想要调用这个对象的被同步锁包起来的方法由于BC线程需要在调用方法之前先拥有解除锁的key,但是这个key恰巧被A占有,那么就会陷入阻塞状态去等待锁的释放,在等待的期间处于对象的锁池。

  1. 等待池(WaitSet)

如果线程A调用了某个对象的wait方法,线程A就会释放该对象的锁同时线程A就进入到了该对象的等待池中进入等待池中的线程不会去竞争该对象的锁。

notify和notifyAll真正的区别:

notifyAll让所有处于等待池中的线程全部进入锁池去竞争获取锁的机会,notify只是会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值