双检锁的另一种形式

背景:sonar对volatile和synchronized不友好,项目背景:mybatis guice 事务代理切面

 

private ThreadLocal<Integer> getTrasactionStatus(project_DB_TRANSACTIONAL projectDbTransactional) {
    SqlSessionManager sqlSessionManager = getSqlSessionManager(projectDbTransactional);
    ThreadLocal<Integer> threadLocal = alreadyInTransaction.get(sqlSessionManager);
    if(threadLocal != null)
        return threadLocal;
     
    threadLocal = alreadyInTransaction.putIfAbsent(sqlSessionManager, new ThreadLocal<>());
    if(threadLocal == null)
        threadLocal = alreadyInTransaction.get(sqlSessionManager);
 
    return threadLocal;
}

 

可见性由concurrenthm负责:解惑如何保证数组元素的可见性(yet)

锁由putifabsent负责

posted on 2022-07-25 21:31  silyvin  阅读(17)  评论(0编辑  收藏  举报