LinkedBlockingQueue嵌套在synchronized,livelock问题下

时间:2015-12-21 19:04:24

标签: java multithreading locking

考虑以下几行

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锁定,或者它会释放它直到它有一个值并接受然后尝试,我可以进入活锁吗?在继续之前再次掌握它?

1 个答案:

答案 0 :(得分:2)

update_all上的锁定未在同步块内的任何位置释放。 srv对现有内容一无所知,对此无能为力。如果LinkedBlockingQueue阻止,则使用相同take()调用的另一个线程将阻塞srv。它最终会在synchronized(srv)上阻止。

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