【发布时间】:2014-11-24 19:53:30
【问题描述】:
下面的代码:
public ReentrantReadWriteLock getLock(String tableName) {
ReentrantReadWriteLock lock = locksMap.get(tableName);
if (lock == null) {
lock = new ReentrantReadWriteLock();
locksMap.put(tableName, lock);
}
}
//其中locksMap是一个HashMap,键为String(tableName),值为ReentrantReadWriteLock(Lock)。
我的问题是,如果线程同时访问这个方法,它们会得到具有相同“tableName”的不同Lock对象,因为Map的get和put方法是分开调用的。
任何带有解释的解决方案将不胜感激? 提前致谢。
【问题讨论】:
-
也许使用ConcurrentHashMap? docs.oracle.com/javase/7/docs/api/java/util/concurrent/…
-
您可能想在这里使用
synchronized块 -
ConcurrentHashMap 有一个 putIfAbsent() 原子方法。自 Java 8 以来甚至更好:一个原子的 computeIfAbsent() 方法。
-
@njzk2 谢谢,考虑使用同步块,但不确定使用 ConcurrentHashMap 还是同步块更有效?
-
只是一般性评论,您最好使用一个包含锁和其他东西的“表”对象实例。然后你可以传递它,只需要 map.get() 它一次(而不是每个操作,包括表锁)。
标签: java multithreading concurrency hashmap