双检锁的另一种形式
背景: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负责