Java将显式锁与同步方法结合在一起

时间:2015-06-12 08:23:18

标签: java multithreading concurrency synchronization locking

我有一个线程安全类容器:

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代码吗?

也赞赏更好的想法。

1 个答案:

答案 0 :(得分:1)

这是不可能的,我害怕。 Java语言使用synchronized (...) { ... }块(和同步方法)强加了严格的嵌套原则。

话虽如此,但有一些令人讨厌的解决方法。在字节码中,同步块转换为两个单独的monitorenter / monitorexit指令。使用sun.mis.Unsafe.monitorEnter()monitorExit()可以实现同样的目标。

但是,在这种情况下,我强烈建议您重新考虑设计。我建议您让getXsetX获取/释放内部Lock(遍历方法也使用)。特别是,您可以对setXgetX方法使用ReadWriteLock。实际上,由于其他原因,这种方法比synchronized方法更好。例如,见:

Why is it a good practice to have separate locks instead of having lock on object that get modified in the synchronized block in java?