Hi Mark,

why didn't you remove the synchronization when you converted the code to ConcurrentLinkedDeque?

The old code had a concurrency problem, since events.size() was checked outside of the synchronize block. I think this is not a problem anymore, but I don't understand the call to events.clear() afterwards the while-loop in events(). We think we have guarded the queue and removed all entries by calling pollFirst repeatedly, so why clear it afterwards?

Regards,
 Felix


Am 15.09.2015 um 13:11 schrieb ma...@apache.org:
Author: markt
Date: Tue Sep 15 11:11:51 2015
New Revision: 1703151

URL: http://svn.apache.org/r1703151
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58381
The list of events is accessed by multiple threads so use a thread safe Deque 
implementation.
Fix a Javadoc comment
Simplify the code a little

Modified:
     tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java

Modified: 
tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java?rev=1703151&r1=1703150&r2=1703151&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java 
Tue Sep 15 11:11:51 2015
@@ -27,9 +27,10 @@ import java.nio.channels.SelectionKey;
  import java.nio.channels.Selector;
  import java.nio.channels.ServerSocketChannel;
  import java.nio.channels.SocketChannel;
+import java.util.Deque;
  import java.util.Iterator;
-import java.util.LinkedList;
  import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedDeque;
  import java.util.concurrent.atomic.AtomicReference;
import org.apache.catalina.tribes.io.ObjectReader;
@@ -56,7 +57,7 @@ public class NioReceiver extends Receive
      private ServerSocketChannel serverChannel = null;
      private DatagramChannel datagramChannel = null;
- protected final LinkedList<Runnable> events = new LinkedList<>();
+    protected final Deque<Runnable> events = new ConcurrentLinkedDeque<>();
public NioReceiver() {
      }
@@ -68,8 +69,10 @@ public class NioReceiver extends Receive
      }
/**
-     * start cluster receiver
-     * @throws IOException
+     * Start cluster receiver.
+     *
+     * @throws IOException If the receiver fails to start
+     *
       * @see org.apache.catalina.tribes.ChannelReceiver#start()
       */
      @Override
@@ -141,25 +144,33 @@ public class NioReceiver extends Receive
public void addEvent(Runnable event) {
          Selector selector = this.selector.get();
-        if ( selector != null ) {
+        if (selector != null) {
              synchronized (events) {
                  events.add(event);
              }
-            if ( log.isTraceEnabled() ) log.trace("Adding event to 
selector:"+event);
-            if ( isListening() ) selector.wakeup();
+            if (log.isTraceEnabled()) {
+                log.trace("Adding event to selector:" + event);
+            }
+            if (isListening()) {
+                selector.wakeup();
+            }
          }
      }
public void events() {
-        if ( events.size() == 0 ) return;
+        if (events.size() == 0) {
+            return;
+        }
          synchronized (events) {
              Runnable r = null;
-            while ( (events.size() > 0) && (r = events.removeFirst()) != null 
) {
+            while ((r = events.pollFirst()) != null ) {
                  try {
-                    if ( log.isTraceEnabled() ) log.trace("Processing event in 
selector:"+r);
+                    if (log.isTraceEnabled()) {
+                        log.trace("Processing event in selector:" + r);
+                    }
                      r.run();
-                } catch ( Exception x ) {
-                    log.error("",x);
+                } catch (Exception x) {
+                    log.error("", x);
                  }
              }
              events.clear();



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to