From db7d89a5c960a7a56bb4c7c3b51e8296f066adad Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Mon, 20 Feb 2017 12:06:08 +0100 Subject: [PATCH] Fixes #1342 - Improve ByteBufferPool scalability. Replaced Lock+ArrayDeque with ConcurrentLinkedDeque. --- .../org/eclipse/jetty/io/ByteBufferPool.java | 64 +++---------------- 1 file changed, 8 insertions(+), 56 deletions(-) diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java index 70fcbb8646c..8f12ee3c8d8 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/ByteBufferPool.java @@ -19,13 +19,11 @@ package org.eclipse.jetty.io; import java.nio.ByteBuffer; -import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Deque; import java.util.List; -import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; import org.eclipse.jetty.util.BufferUtil; @@ -128,8 +126,7 @@ public interface ByteBufferPool class Bucket { - private final Lock _lock = new ReentrantLock(); - private final Queue _queue = new ArrayDeque<>(); + private final Deque _queue = new ConcurrentLinkedDeque<>(); private final ByteBufferPool _pool; private final int _capacity; private final AtomicInteger _space; @@ -181,72 +178,27 @@ public interface ByteBufferPool private void queueOffer(ByteBuffer buffer) { - Lock lock = _lock; - lock.lock(); - try - { - _queue.offer(buffer); - } - finally - { - lock.unlock(); - } + _queue.offerFirst(buffer); } private ByteBuffer queuePoll() { - Lock lock = _lock; - lock.lock(); - try - { - return _queue.poll(); - } - finally - { - lock.unlock(); - } + return _queue.poll(); } private void queueClear() { - Lock lock = _lock; - lock.lock(); - try - { - _queue.clear(); - } - finally - { - lock.unlock(); - } + _queue.clear(); } boolean isEmpty() { - Lock lock = _lock; - lock.lock(); - try - { - return _queue.isEmpty(); - } - finally - { - lock.unlock(); - } + return _queue.isEmpty(); } int size() { - Lock lock = _lock; - lock.lock(); - try - { - return _queue.size(); - } - finally - { - lock.unlock(); - } + return _queue.size(); } @Override