剑指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都可以去唤醒正在wait的线程。

紧接着,我们需要明白两个概念,在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、付费专栏及课程。

余额充值