Monitor结构解读之EntryQ和WaitSet的区别

EntryQ(或_EntryList)和WaitSet(或_WaitSet)在Java的monitor机制中扮演着不同的角色,它们之间的主要区别体现在以下几个方面:

1. 等待原因和机制

  • EntryQ(或_EntryList)
    • 等待原因:EntryQ(或_EntryList)用于存放所有等待获取锁的线程。当多个线程尝试进入一个同步块(即尝试获取对象的锁)时,如果锁已经被其他线程持有,那么这些线程就会进入该对象的EntryQ(或_EntryList)。
    • 机制:这是一种锁竞争的情况。线程在EntryQ(或_EntryList)中等待,直到锁变得可用。一旦锁被释放,处于EntryQ(或_EntryList)的线程将尝试获取锁。如果成功,它将离开EntryQ(或_EntryList)并进入同步块;如果失败,它将继续留在EntryQ(或_EntryList)中等待。
  • WaitSet(或_WaitSet)
    • 等待原因:WaitSet(或_WaitSet)用于存放所有在monitor上调用wait()方法而进入等待状态的线程。这通常发生在一个线程需要等待某个特定条件变为真时,例如等待某个资源变得可用或等待某个条件满足。
    • 机制:线程在WaitSet(或_WaitSet)中等待,直到它被另一个线程通过调用相同对象的notify()或notifyAll()方法唤醒。在等待集中的线程不会竞争对象锁。

2. 线程状态

  • EntryQ(或_EntryList)中的线程:这些线程处于BLOCKED状态,即它们正在等待获取锁。
  • WaitSet(或_WaitSet)中的线程:这些线程处于WAITING状态,即它们已经释放了锁并在等待某个条件的变化。

3. 锁的行为

  • EntryQ(或_EntryList):线程在EntryQ(或_EntryList)中竞争锁,一旦锁被释放,它们将尝试获取锁。这是实现monitor互斥功能的关键部分。
  • WaitSet(或_WaitSet):线程在WaitSet(或_WaitSet)中不参与锁的竞争。它们等待的是条件的变化,并在条件满足且被唤醒后重新尝试获取锁。

4. 唤醒后的行为

  • 当WaitSet(或_WaitSet)中的线程被notify()或notifyAll()唤醒时,它们并不会立即执行。被唤醒的线程首先必须重新获得与该对象关联的锁。如果锁当前被其他线程持有,那么这个刚被唤醒的线程将会进入EntryQ(或_EntryList),在那里等待直到锁变得可用。
  • 一旦线程在EntryQ(或_EntryList)中获得锁,它将离开该队列并进入同步块或方法,继续执行其任务。

总之,EntryQ(或_EntryList)和WaitSet(_或WaitSet)在Java的monitor机制中分别管理着等待获取锁的线程和等待条件变化的线程。它们通过不同的机制来确保线程同步的正确性和高效性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值