【发布时间】:2015-06-12 08:23:17
【问题描述】:
我有一个线程安全的类容器:
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 代码吗?
更好的想法也值得赞赏。
【问题讨论】:
-
lock()和unlock()在getX和setX中的第一个和最后一个怎么样? -
@see ReentrantLock
-
@aioobe:我想将同步方法与显式锁结合起来(希望它是可能的,但我认为这是因为在幕后同步关键字获取对象锁)。
-
@Lance Java:但在我的情况下,您将如何在 for 循环中使用 try-finally?也许尝试所有的 for 循环并最终释放所有的锁?解锁解锁的锁可以吗?
-
关于不同的方法:如果你解释一下你用 Container 做什么,也许用不可变容器的解决方案会更好......
标签: java multithreading concurrency synchronization locking