我在代码中使用concurrentskiplistmap,我希望确保一个方法是并发安全的。
public synchronized UserLogin getOrCreateLogin(Integer userId) {
// new user
if (!sessionCache.containsKey(userId)) {
String sessionKey = sessionKeyPool.getKey();
sessionCache.putIfAbsent(userId, sessionKey);
return userSessions.computeIfAbsent(sessionKey, userLogin -> new UserLogin(userId, sessionKey));
} else { // old user, check session
String oldSessionKey = sessionCache.get(userId);
UserLogin old = userSessions.get(oldSessionKey);
if (!old.isExpired()) return old;
log.info("Session expired! Create another. User id: " + userId + ", last login: " + old.getStartTime());
String newKey = sessionKeyPool.getKey();
UserLogin another = new UserLogin(userId, newKey);
userSessions.replace(newKey, another);
sessionCache.replace(userId, newKey);
return another;
}
}
我知道Map是自动的 containsKey()
, get
还有一个。但这并不意味着两个线程不能同时访问整个块,但至少行和行之间的关系是在保护之前发生的(到达此行的第一个线程将首先退出此行)。但是,如何实际使用这些方法来获得可组合且一致的结果呢?如何锁定这些线路?
如何在不影响输出数据一致性的情况下锁定以获得最佳粒度?
暂无答案!
目前还没有任何答案,快来回答吧!