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() 唤醒时,它们会从等待集移动到入口集,直到它们能够重新获得锁。一旦获得锁,它们就会继续执行。

你可能感兴趣的:(Java基础,java,开发语言)