From 661c6c161cf6c62c9dd26c70e08bc3f2adc5bbf1 Mon Sep 17 00:00:00 2001 From: dengliming Date: Sun, 20 Sep 2026 21:19:20 +0800 Subject: [PATCH] fix(common): publish queue configuration safely --- .../concurrent/MemorySafeLinkedBlockingQueue.java | 4 ++-- .../MemorySafeLinkedBlockingQueueTest.java | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/shenyu-common/src/main/java/org/apache/shenyu/common/concurrent/MemorySafeLinkedBlockingQueue.java b/shenyu-common/src/main/java/org/apache/shenyu/common/concurrent/MemorySafeLinkedBlockingQueue.java index ee9e6b8bbef6..6dd9a0bae2d1 100644 --- a/shenyu-common/src/main/java/org/apache/shenyu/common/concurrent/MemorySafeLinkedBlockingQueue.java +++ b/shenyu-common/src/main/java/org/apache/shenyu/common/concurrent/MemorySafeLinkedBlockingQueue.java @@ -30,9 +30,9 @@ public class MemorySafeLinkedBlockingQueue extends LinkedBlockingQueue { private static final long serialVersionUID = 8032578371749960142L; - private int maxFreeMemory; + private volatile int maxFreeMemory; - private Rejector rejector; + private volatile Rejector rejector; public MemorySafeLinkedBlockingQueue(final int maxFreeMemory) { super(Integer.MAX_VALUE); diff --git a/shenyu-common/src/test/java/org/apache/shenyu/common/concurrent/MemorySafeLinkedBlockingQueueTest.java b/shenyu-common/src/test/java/org/apache/shenyu/common/concurrent/MemorySafeLinkedBlockingQueueTest.java index 8968a972d476..60b356ea89ba 100644 --- a/shenyu-common/src/test/java/org/apache/shenyu/common/concurrent/MemorySafeLinkedBlockingQueueTest.java +++ b/shenyu-common/src/test/java/org/apache/shenyu/common/concurrent/MemorySafeLinkedBlockingQueueTest.java @@ -19,9 +19,13 @@ import org.junit.jupiter.api.Test; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; public class MemorySafeLinkedBlockingQueueTest { @Test @@ -44,4 +48,13 @@ public void testCustomReject() throws Exception { assertThrows(RejectException.class, () -> queue.offer(() -> { })); } + + @Test + public void testMutableConfigurationIsVolatile() throws NoSuchFieldException { + Field maxFreeMemory = MemorySafeLinkedBlockingQueue.class.getDeclaredField("maxFreeMemory"); + Field rejector = MemorySafeLinkedBlockingQueue.class.getDeclaredField("rejector"); + + assertTrue(Modifier.isVolatile(maxFreeMemory.getModifiers())); + assertTrue(Modifier.isVolatile(rejector.getModifiers())); + } }