双检锁的另一种形式
背景: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负责
浙公网安备 33010602011771号