问题描述
在我的应用程序中,我有一个“Manager”类,它引用了一个 DAO 类,该类从 DB 加载数据并填充 HashMap 作为缓存解决方案。
这是一个片段
class UserManager {
private final UserDAO userDAO;
private final Map<Long,User> users;
private final StampedLock lock = new StampedLock();
public UserManager() {
loadUsersFromDB();
}
// 99% of the times this method is called
public getUserById(long id) {
long stamp = lock.readLock();
try {
return users.get(id);
} finally {
lock.unlock(stamp);
}
}
// This is done once when CTOR calls it and from time to time
// by explicitly calling it from outside.
public void loadUsersFromDB() {
Map<Long,User> loadedUsers = userDAO.loadUsers();
long stamp = lock.writeLock();
try {
this.users = loadedUsers;
} finally {
lock.unlock(stamp);
}
}
}
这段代码在多线程环境中工作,这里的问题是在这种情况下使用 StampedLock
是一种 OVERKILL,因为大多数时间它执行 READ 操作,偶尔从 DB 和分配给班级成员。
我正在考虑删除 StampedLock
并改为使用简单的 atomicreference<Map<Long,User>>
,这样大多数情况下它将是一个简单的 get
,偶尔会出现 { {1}}。
你怎么看??
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)