gpt4 book ai didi

java - LinkedBlockingQueue 嵌套在synchronized下,活锁问题

转载 作者:行者123 更新时间:2023-12-02 04:04:59 26 4
gpt4 key购买 nike

考虑以下几行

public Result doSomething(Service srv) throws InterruptedException 
{
synchronized(srv)
{
if (this._registeredServices.containsKey(srv.getId()))
{
return this._queue.get(srv.getId()).take();
}
throw new IllegalStateException();
}
}

其中 this._queue 是通过

实现的
private ConcurrentHashMap<String, LinkedBlockingQueue<Result>> _queue;

几个线程正在使用同步从不同的地方访问srv

我的问题是,当 take 方法正在等待数据并仍然持有 srv 锁时,我是否可以进入活锁,或者释放它直到它有一个值并在继续之前尝试再次掌握它?

最佳答案

srv 上的锁不会在同步块(synchronized block)内的任何地方释放。 LinkedBlockingQueue 对它的存在一无所知,也无法对其执行任何操作。如果 take() 阻塞,则使用相同 srv 调用的另一个线程将在 synchronized(srv) 上阻塞。但最终它也会阻塞 take()

顺便说一句,代码看起来不必要地复杂。

关于java - LinkedBlockingQueue 嵌套在synchronized下,活锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34402607/

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