考虑以下几行

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/

10-10 03:10