如何将第二个锁与Collections.synchronizedMap关联

时间:2011-03-30 09:43:06

标签: java concurrency

我希望在地图上有第二个锁定,类型为Collections.synchronizedMap。我怎么能拥有它?

2 个答案:

答案 0 :(得分:2)

目前尚不清楚为什么要这样做,但这里基本上是这样的:

private Map map = Collections.synchronizedMap(new HashMap());
private Object lock = new Object();

public void someMethod() {
    synchronized (lock) {
        // access map here
    }
}

答案 1 :(得分:1)

private ReadWriteLock mapLock = new ReentrantReadWriteLock();
mapLock.writeLock().lock(); 
try {  
   final TableManagementInfo table = TABLES.get(mKey);
  

我做错了.. ??

取决于您要执行的操作以及后面的代码。

你应该finally unlock()。但是人们不得不问为什么你不想使用synchronized块(参见@WhiteFang34的回答)。

此外,如果您在关键部分中所做的只是在已经并发的地图上调用单个get,则不需要额外的锁定。

另一方面,如果您做其他事情,您可能不需要首先使用同步地图(锁定不足)(如果您可以在所有地方使用外锁,请使用外锁)使用地图)。

总而言之,您不希望在同步块执行时使用ReadWriteLock,并且您不希望使用两个锁来执行(使用SynchronizedMap或应用程序级锁定,但不能同时使用两者)。