2

在我的应用程序中,我有一个“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.

你怎么看??

4

0 回答 0