diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannel.java b/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannel.java index d08d4b6b0a..7a3c8189c7 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannel.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannel.java @@ -27,6 +27,7 @@ import java.net.SocketAddress; import java.nio.channels.SocketChannel; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicBoolean; import org.jboss.netty.channel.AbstractChannel; import org.jboss.netty.channel.Channel; @@ -49,6 +50,7 @@ abstract class NioSocketChannel extends AbstractChannel final SocketChannel socket; private final NioSocketChannelConfig config; + final AtomicBoolean writeTaskInTaskQueue = new AtomicBoolean(); final Runnable writeTask = new WriteTask(); final Queue writeBuffer = new ConcurrentLinkedQueue(); @@ -119,6 +121,7 @@ abstract class NioSocketChannel extends AbstractChannel } public void run() { + writeTaskInTaskQueue.set(false); NioWorker.write(NioSocketChannel.this, false); } } diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java b/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java index 8cea738452..9b54a1729f 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java @@ -320,7 +320,9 @@ class NioWorker implements Runnable { if (mightNeedWakeup) { NioWorker worker = channel.getWorker(); if (worker != null && Thread.currentThread() != worker.thread) { - worker.taskQueue.offer(channel.writeTask); + if (channel.writeTaskInTaskQueue.compareAndSet(false, true)) { + worker.taskQueue.offer(channel.writeTask); + } if (worker.wakenUp.compareAndSet(false, true)) { worker.selector.wakeup(); }