我有一个线程安全类容器:
public class Container {
private int x;
...
public synchronized int getX();
public synchronized void setX(int x);
}
然后我有一个容器列表:
List<Container> containers;
我想遍历列表,在每次迭代时获取容器的锁,并且只在循环结束时释放所有锁。 像这样:
for(Container c : containers) {
c.lock();
//do stuff
}
for(Container c : containers)
c.unlock();
我仍然希望其他线程能够继续使用未锁定容器的getX和setX方法,但出于各种原因,我不想为已经分析的容器允许这样做。
你知道这个的java代码吗?
也赞赏更好的想法。
答案 0 :(得分:1)
这是不可能的,我害怕。 Java语言使用synchronized (...) { ... }
块(和同步方法)强加了严格的嵌套原则。
话虽如此,但有一些令人讨厌的解决方法。在字节码中,同步块转换为两个单独的monitorenter
/ monitorexit
指令。使用sun.mis.Unsafe.monitorEnter()
和monitorExit()
可以实现同样的目标。
但是,在这种情况下,我强烈建议您重新考虑设计。我建议您让getX
和setX
获取/释放内部Lock
(遍历方法也使用)。特别是,您可以对setX
和getX
方法使用ReadWriteLock
。实际上,由于其他原因,这种方法比synchronized
方法更好。例如,见: