在我的应用程序中,我有一个“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
并改用 simple AtomicReference<Map<Long, User>>
,这样大多数时候它会变得很简单get
,偶尔会使用set
.
你怎么看??