如何解决以线程安全的方式从数据库中读取数据
在我的应用程序中,我有一个“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 举报,一经查实,本站将立刻删除。