You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2012/07/11 23:15:48 UTC

svn commit: r1360406 - /cxf/trunk/api/src/main/java/org/apache/cxf/workqueue/AutomaticWorkQueueImpl.java

Author: dkulp
Date: Wed Jul 11 21:15:48 2012
New Revision: 1360406

URL: http://svn.apache.org/viewvc?rev=1360406&view=rev
Log:
If another thread is working on adding threads, just return and let it
handle it.

Modified:
    cxf/trunk/api/src/main/java/org/apache/cxf/workqueue/AutomaticWorkQueueImpl.java

Modified: cxf/trunk/api/src/main/java/org/apache/cxf/workqueue/AutomaticWorkQueueImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/api/src/main/java/org/apache/cxf/workqueue/AutomaticWorkQueueImpl.java?rev=1360406&r1=1360405&r2=1360406&view=diff
==============================================================================
--- cxf/trunk/api/src/main/java/org/apache/cxf/workqueue/AutomaticWorkQueueImpl.java (original)
+++ cxf/trunk/api/src/main/java/org/apache/cxf/workqueue/AutomaticWorkQueueImpl.java Wed Jul 11 21:15:48 2012
@@ -71,7 +71,7 @@ public class AutomaticWorkQueueImpl impl
     
     AWQThreadFactory threadFactory;
     ReentrantLock mainLock;
-    
+    final ReentrantLock addThreadLock = new ReentrantLock();
     
     DelayQueue<DelayedTaskWrapper> delayQueue;
     WatchDog watchDog;
@@ -440,20 +440,25 @@ public class AutomaticWorkQueueImpl impl
         ex.execute(r);
         if (addWorkerMethod != null 
             && !ex.getQueue().isEmpty() 
-            && this.approxThreadCount < highWaterMark) {
-            mainLock.lock();
+            && this.approxThreadCount < highWaterMark
+            && addThreadLock.tryLock()) {
             try {
-                int ps = this.getPoolSize();
-                int sz = executor.getQueue().size();
-                int sz2 = this.getActiveCount();
-                
-                if ((sz + sz2) > ps) {
-                    ReflectionUtil.setAccessible(addWorkerMethod).invoke(executor, addWorkerArgs);
+                mainLock.lock();
+                try {
+                    int ps = this.getPoolSize();
+                    int sz = executor.getQueue().size();
+                    int sz2 = this.getActiveCount();
+                    
+                    if ((sz + sz2) > ps) {
+                        ReflectionUtil.setAccessible(addWorkerMethod).invoke(executor, addWorkerArgs);
+                    }
+                } catch (Exception exc) {
+                    //ignore
+                } finally {
+                    mainLock.unlock();
                 }
-            } catch (Exception exc) {
-                //ignore
             } finally {
-                mainLock.unlock();
+                addThreadLock.unlock();
             }
         }
     }