concurrentskiplistmap如何正确使用

rkue9o1l  于 2021-07-08  发布在  Java
关注(0)|答案(0)|浏览(218)

我在代码中使用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 还有一个。但这并不意味着两个线程不能同时访问整个块,但至少行和行之间的关系是在保护之前发生的(到达此行的第一个线程将首先退出此行)。但是,如何实际使用这些方法来获得可组合且一致的结果呢?如何锁定这些线路?
如何在不影响输出数据一致性的情况下锁定以获得最佳粒度?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题