Java并发- wait set & entry set

基本介绍

在Java多线程编程中,wait set(等待集)和entry set(入口集)是两种不同的线程队列,它们用于管理线程同步和通信。它们的主要区别在于它们的用途和工作方式。

  1. Wait Set(等待集):

    • 当一个线程调用了对象的 wait() 方法时,它进入该对象的等待集。
    • 这通常发生在一个线程需要等待某个特定条件变为真时。例如,当它等待某个资源变得可用或等待某个条件满足时。
    • 线程在等待集中等待,直到它被另一个线程通过调用相同对象的 notify()notifyAll() 方法唤醒。
    • 在等待集中的线程不会竞争对象锁。
  2. Entry Set(入口集):

    • 当多个线程尝试进入一个同步块(即尝试获取对象的锁)时,如果锁已经被其他线程持有,那么这些线程就会进入该对象的入口集。
    • 这是一种锁竞争的情况。线程在入口集中等待,直到锁变得可用。
    • 一旦锁被释放,处于入口集的线程将尝试获取锁。如果成功,它将离开入口集并进入同步块;如果失败,它将继续留在入口集中等待。

总结来说,等待集用于线程间的协调和条件等待,而入口集用于管理对对象锁的竞争。两者都涉及线程等待的情况,但等待的原因和机制不同。在等待集中的线程是在等待某个条件的变化,而在入口集中的线程是在等待获取锁。

被唤醒后的线程做什么?

当一个线程在等待集(wait set)中等待时,如果另一个线程对同一个对象调用 notify()notifyAll() 方法,等待的线程会被唤醒。但是,唤醒后的行为取决于它如何与对象锁(monitor lock)交互。下面是这一过程的详细说明:

  1. 被唤醒后的流程:

    • 当一个线程从等待集中被 notify()notifyAll() 唤醒时,它并不会立即执行。
    • 被唤醒的线程首先必须重新获得与该对象关联的锁。
    • 如果锁当前被其他线程持有,那么这个刚被唤醒的线程将会进入该对象的入口集(entry set),在那里等待直到锁变得可用。
  2. 等待锁:

    • 在入口集中的线程会竞争锁。一旦锁变得可用,其中一个线程(由 JVM 的调度策略决定哪一个)将获得锁并继续执行。
  3. 重新获取锁后的执行:

    • 当被唤醒的线程获取到锁后,它会从 wait() 方法调用之后的地方继续执行,而不是从同步块的开始执行。

因此,可以说当线程被 notify()notifyAll() 唤醒时,它们会从等待集移动到入口集,直到它们能够重新获得锁。一旦获得锁,它们就会继续执行。

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫客36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值