Author: tv Date: Tue Jan 19 10:17:03 2016 New Revision: 1725462 URL: http://svn.apache.org/viewvc?rev=1725462&view=rev Log: Address concurrency issues reported by Findbugs
Modified: commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java Modified: commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java URL: http://svn.apache.org/viewvc/commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java?rev=1725462&r1=1725461&r2=1725462&view=diff ============================================================================== --- commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java (original) +++ commons/proper/jcs/trunk/commons-jcs-core/src/main/java/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java Tue Jan 19 10:17:03 2016 @@ -26,7 +26,6 @@ import java.util.concurrent.ConcurrentHa import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.jcs.utils.threadpool.PoolConfiguration.WhenBlockedPolicy; import org.apache.commons.logging.Log; @@ -116,16 +115,12 @@ public class ThreadPoolManager /** Map of names to pools. */ private ConcurrentHashMap<String, ThreadPoolExecutor> pools; - /** Lock for pools initialization. */ - private ReentrantLock poolLock; - /** * No instances please. This is a singleton. */ private ThreadPoolManager() { this.pools = new ConcurrentHashMap<String, ThreadPoolExecutor>(); - this.poolLock = new ReentrantLock(); configure(); } @@ -244,33 +239,22 @@ public class ThreadPoolManager if ( pool == null ) { - poolLock.lock(); - - try + if ( log.isDebugEnabled() ) { - // double check - pool = pools.get( name ); + log.debug( "Creating pool for name [" + name + "]" ); + } - if ( pool == null ) - { - if ( log.isDebugEnabled() ) - { - log.debug( "Creating pool for name [" + name + "]" ); - } - - PoolConfiguration config = loadConfig( PROP_NAME_ROOT + "." + name ); - pool = createPool( config ); - pools.put( name, pool ); - - if ( log.isDebugEnabled() ) - { - log.debug( "PoolName = " + getPoolNames() ); - } - } + PoolConfiguration config = loadConfig( PROP_NAME_ROOT + "." + name ); + pool = createPool( config ); + ThreadPoolExecutor _pool = pools.putIfAbsent( name, pool ); + if (_pool != null) + { + pool = _pool; } - finally + + if ( log.isDebugEnabled() ) { - poolLock.unlock(); + log.debug( "PoolName = " + getPoolNames() ); } }