请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对于wait,锁池和等待池的疑问

老师,这里我有点绕,你能不能帮我看一下我的理解是不是对的。

当一个线程被wait()、wait(long ms)、sleep(long ms),或者自己对其他线程使用join()的时候,都会进入一个等待池中,只不过进入超时等待状态的线程会在时间到之后自动唤醒。

然后无论是自动唤醒的线程还是被notify的线程都会进入到一个锁池中去竞争他们各自需要的锁。假如在锁池中竞争到了锁,或者有些线程根本不需要竞争锁,那么就会进入runnable的就绪状态等待CPU调度。

假如在锁池中没有竞争到锁,那么就会被直接阻塞进入blocked状态。

对于notifyAll来说,相当于清空等待池,将所有线程都赶入锁池中,然后在锁池中再根据每个线程的自身情况分别判断接下来该进入就绪态还是阻塞态。

1.我这样理解有问题么?
2.是不是无论需不需要竞争锁都会先进入锁池去尝试竞争锁,假如不需要就视作竞争成功处理?
3.sleep的底层是不是就是调用的unpark啊?
4.对于等待和阻塞的区别是不是就在于只有碰到synchronized关键字的时候才会进入到阻塞(被动),而在任何情况下都可以通过除wait方法外的其他方式进入等待状态(主动调用),对于wait来说该线程不仅进入等待状态,还会失去当前synchronized( o ) 锁住的 锁o

谢谢老师

正在回答

1回答

同学好,

首先,sleep不会进入等待池,因为本身就没释放锁,只有wait才会进入等待池;

其次,第一次进来发现没有竞争,是不用进锁池的,具体可以看锁膨胀;

再者,sleep底层调用的是操作系统的ParkEventpark函数,不是LockSupport.park;

https://juejin.cn/post/6844903971463626766

最后,阻塞是被动的,等待可以是主动的

0 回复 有任何疑惑可以回复我~
  • 提问者 湿地车手 #1
    哦哦哦,这么一说我就清晰了,谢谢老师
    
    昨天没看到后面的部分,其实也就是说只有升级到到重量级锁的时候才会进入锁池?
    
    那么sleep掉的线程去哪里了呢,notify会唤醒sleep和join掉的线程么,对于sleep和join掉的线程来说notify和notifyAll有什么区别呢
    回复 有任何疑惑可以回复我~ 2021-12-23 00:39:45
  • 翔仔 回复 提问者 湿地车手 #2
    sleep的线程还是占有着cpu,还是当前线程呢;notify不会唤醒这两者,首先sleep本身就还占着cpu,而join需要等待其他线程完成;没有区别,都跟sleep和join没关系
    回复 有任何疑惑可以回复我~ 2021-12-23 22:53:19
  • 提问者 湿地车手 回复 翔仔 #3
    搜得死捏~阿里嘎多
    回复 有任何疑惑可以回复我~ 2021-12-23 23:45:37
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信