考虑以下几行
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
锁定,或者它会释放它直到它有一个值并接受然后尝试,我可以进入活锁吗?在继续之前再次掌握它?
答案 0 :(得分:2)
update_all
上的锁定未在同步块内的任何位置释放。 srv
对现有内容一无所知,对此无能为力。如果LinkedBlockingQueue
阻止,则使用相同take()
调用的另一个线程将阻塞srv
。它最终会在synchronized(srv)
上阻止。
顺便说一句,代码看起来不必要地复杂。