我希望在地图上有第二个锁定,类型为Collections.synchronizedMap。我怎么能拥有它?
答案 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或应用程序级锁定,但不能同时使用两者)。