gpt4 book ai didi

java - LockSupport.park(Object) 是否释放阻塞对象的监视器锁

转载 作者:行者123 更新时间:2023-11-29 05:30:10 27 4
gpt4 key购买 nike

我正在尝试断言使用 LockSupport.park(Object blocker) 是否会释放 blocker 的监视器锁定对象。即:如果在blocker同步的section中调用,blocker的监听锁会不会被释放?

这是我做的一个 junit 测试,让我觉得是这样。

我知道线程由于调用 Òbject.wait 或 LockSupport.park() 而处于 WAITING 状态,这在我看来就像使用了相同的底层机制.但是,javadoc 没有明确说明我的问题,所以我不确定。

final Object blocker    = new Object();
final Thread thread = new Thread() {

@Override
public void run() {
synchronized(blocker) {
while(!interrupted()) {
assertTrue(holdsLock(blocker));
LockSupport.park(blocker);
}
}
}
};
try {
thread.start();
while(thread.getState() != Thread.State.WAITING)
Thread.sleep(100);
assertEquals(0, ManagementFactory.getThreadMXBean().getThreadInfo(thread.getId()).getLockedMonitors().length);
} finally {
thread.interrupt();
}

最佳答案

简单的答案是否定的。 LockSupport 不适用于一般应用程序编程。由于没有保护(如同步等待/通知所提供的那样),您需要对整个线程环境进行显式控制。也就是说,您不能使用第三方软件并期望它符合您的标准。

有关如何使用 park/unpark 的很好示例,请查看 ForkJoinPool 的源代码。

关于java - LockSupport.park(Object) 是否释放阻塞对象的监视器锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21375940/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com