Java并发- wait set & entry set
发布时间:2024年01月21日
基本介绍
在Java多线程编程中,wait set(等待集)和entry set(入口集)是两种不同的线程队列,它们用于管理线程同步和通信。它们的主要区别在于它们的用途和工作方式。
-
Wait Set(等待集):
- 当一个线程调用了对象的
wait()
方法时,它进入该对象的等待集。 - 这通常发生在一个线程需要等待某个特定条件变为真时。例如,当它等待某个资源变得可用或等待某个条件满足时。
- 线程在等待集中等待,直到它被另一个线程通过调用相同对象的
notify()
或 notifyAll()
方法唤醒。 - 在等待集中的线程不会竞争对象锁。
-
Entry Set(入口集):
- 当多个线程尝试进入一个同步块(即尝试获取对象的锁)时,如果锁已经被其他线程持有,那么这些线程就会进入该对象的入口集。
- 这是一种锁竞争的情况。线程在入口集中等待,直到锁变得可用。
- 一旦锁被释放,处于入口集的线程将尝试获取锁。如果成功,它将离开入口集并进入同步块;如果失败,它将继续留在入口集中等待。
总结来说,等待集用于线程间的协调和条件等待,而入口集用于管理对对象锁的竞争。两者都涉及线程等待的情况,但等待的原因和机制不同。在等待集中的线程是在等待某个条件的变化,而在入口集中的线程是在等待获取锁。
被唤醒后的线程做什么?
当一个线程在等待集(wait set)中等待时,如果另一个线程对同一个对象调用 notify()
或 notifyAll()
方法,等待的线程会被唤醒。但是,唤醒后的行为取决于它如何与对象锁(monitor lock)交互。下面是这一过程的详细说明:
-
被唤醒后的流程:
- 当一个线程从等待集中被
notify()
或 notifyAll()
唤醒时,它并不会立即执行。 - 被唤醒的线程首先必须重新获得与该对象关联的锁。
- 如果锁当前被其他线程持有,那么这个刚被唤醒的线程将会进入该对象的入口集(entry set),在那里等待直到锁变得可用。
-
等待锁:
- 在入口集中的线程会竞争锁。一旦锁变得可用,其中一个线程(由 JVM 的调度策略决定哪一个)将获得锁并继续执行。
-
重新获取锁后的执行:
- 当被唤醒的线程获取到锁后,它会从
wait()
方法调用之后的地方继续执行,而不是从同步块的开始执行。
因此,可以说当线程被 notify()
或 notifyAll()
唤醒时,它们会从等待集移动到入口集,直到它们能够重新获得锁。一旦获得锁,它们就会继续执行。
文章来源:https://blog.csdn.net/weixin_43844521/article/details/135732473
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!