考虑以下几行
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
上的锁定不会在同步块内的任何位置释放。 LinkedBlockingQueue
对它的存在一无所知,并且对此无能为力。如果take()
阻塞,则另一个使用相同srv
调用的线程将在synchronized(srv)
上阻塞。最终它也会在take()
上阻塞。
顺便说一下,代码看起来不必要地复杂。
关于java - LinkedBlockingQueue嵌套在同步,活锁问题下,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34402607/