From a0c310cb0650e6edc349bfc7c87bd76026da28f4 Mon Sep 17 00:00:00 2001 From: Ben Manes Date: Mon, 8 Feb 2021 02:01:05 -0800 Subject: [PATCH] Prefer VarHandle for ring buffer array --- .../benmanes/caffeine/cache/BoundedBuffer.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/caffeine/src/main/java/com/github/benmanes/caffeine/cache/BoundedBuffer.java b/caffeine/src/main/java/com/github/benmanes/caffeine/cache/BoundedBuffer.java index 062474a767..89c09b26f2 100644 --- a/caffeine/src/main/java/com/github/benmanes/caffeine/cache/BoundedBuffer.java +++ b/caffeine/src/main/java/com/github/benmanes/caffeine/cache/BoundedBuffer.java @@ -17,7 +17,6 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; -import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.function.Consumer; /** @@ -56,12 +55,13 @@ protected Buffer create(E e) { } static final class RingBuffer extends BBHeader.ReadAndWriteCounterRef implements Buffer { - final AtomicReferenceArray buffer; + static final VarHandle BUFFER = MethodHandles.arrayElementVarHandle(Object[].class); + + final Object[] buffer; - @SuppressWarnings({"unchecked", "cast", "rawtypes"}) public RingBuffer(E e) { - buffer = new AtomicReferenceArray<>(BUFFER_SIZE); - buffer.lazySet(0, e); + buffer = new Object[BUFFER_SIZE]; + BUFFER.set(buffer, 0, e); } @Override @@ -74,7 +74,7 @@ public int offer(E e) { } if (casWriteCounter(tail, tail + 1)) { int index = (int) (tail & MASK); - buffer.lazySet(index, e); + BUFFER.setRelease(buffer, index, e); return Buffer.SUCCESS; } return Buffer.FAILED; @@ -90,12 +90,12 @@ public void drainTo(Consumer consumer) { } do { int index = (int) (head & MASK); - E e = buffer.get(index); + E e = (E) BUFFER.getVolatile(buffer, index); if (e == null) { // not published yet break; } - buffer.lazySet(index, null); + BUFFER.setRelease(buffer, index, null); consumer.accept(e); head++; } while (head != tail);