【发布时间】:2014-06-12 12:17:22
【问题描述】:
我正在尝试编写一个单例类,它将用于简单的缓存实现。我遵循 双重检查锁定 模式来获取实例,其中实例是类中的 volatile 成员。它还包含一个 HashTable 用于存储数据。
如果我尝试通过方法访问映射内的值,是否应该提供“同步”关键字来阻止并发访问?我问这个问题是因为 UserCache 本身是 syncronized 在 getInstance() 方法中使用双重检查锁定
或者使用 ConcurrentHashMap 而不是 HashTable 更好?
查看下面的代码 sn-p 了解更多详情。
public class UserCache {
private volatile static UserCache instance;
private Hashtable<String, User> users = null;
private UserCache() {
this.users = new Hashtable<String, User>();
}
public static UserCache getInstance() {
if (instance == null) {
synchronized (UserCache.class) {
if (instance == null) {
instance = new UserCache();
}
}
}
return instance;
}
public synchronized User getUser(String userUid) {
return this.users.get(userUid);
}
public synchronized boolean addUser(User user) {
if (isValidUser(user.getUserUid())) {
return false;
}
this.users.put(user.getUserUid(), user);
return true;
}
...
任何建议将不胜感激:)
提前致谢
【问题讨论】:
-
最好使用并发哈希映射,因为同步对您没有多大帮助。
-
感谢您的建议@RomanCpan>
标签: java singleton hashtable synchronized concurrenthashmap