diff --git a/vertx-core/src/main/java/io/vertx/core/impl/LocalSeq.java b/vertx-core/src/main/java/io/vertx/core/impl/LocalSeq.java
index 17eff10fa25..b4ade7f8e29 100644
--- a/vertx-core/src/main/java/io/vertx/core/impl/LocalSeq.java
+++ b/vertx-core/src/main/java/io/vertx/core/impl/LocalSeq.java
@@ -15,7 +15,6 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
/**
* @author Julien Viet
@@ -38,7 +37,11 @@ public synchronized static void reset() {
locals.add(ContextInternal.LOCAL_MAP);
}
- synchronized static ContextLocal>[] get() {
+ synchronized static ContextLocal>[] getArray() {
return locals.toArray(new ContextLocal[0]);
}
+
+ synchronized static List> getList() {
+ return List.copyOf(locals);
+ }
}
diff --git a/vertx-core/src/main/java/io/vertx/core/impl/VertxImpl.java b/vertx-core/src/main/java/io/vertx/core/impl/VertxImpl.java
index e617d9d2dac..dbc974f09c2 100644
--- a/vertx-core/src/main/java/io/vertx/core/impl/VertxImpl.java
+++ b/vertx-core/src/main/java/io/vertx/core/impl/VertxImpl.java
@@ -150,8 +150,6 @@ private static ThreadFactory virtualThreadFactory() {
private final FileResolver fileResolver;
private final EventExecutorProvider eventExecutorProvider;
private final Map sharedNetServers = new HashMap<>();
- private final ContextLocal>[] contextLocals;
- private final List> contextLocalsList;
final WorkerPool workerPool;
final WorkerPool internalWorkerPool;
final WorkerPool virtualThreadWorkerPool;
@@ -211,8 +209,6 @@ private static ThreadFactory virtualThreadFactory() {
ThreadFactory virtualThreadFactory = virtualThreadFactory();
PoolMetrics virtualThreadWorkerPoolMetrics = metrics != null && virtualThreadFactory != null ? metrics.createPoolMetrics("worker", "vert.x-virtual-thread", -1) : null;
- contextLocals = LocalSeq.get();
- contextLocalsList = Collections.unmodifiableList(Arrays.asList(contextLocals));
closeFuture = new CloseFuture(log);
maxEventLoopExecTime = maxEventLoopExecuteTime;
maxEventLoopExecTimeUnit = maxEventLoopExecuteTimeUnit;
@@ -619,6 +615,7 @@ public boolean cancelTimer(long id) {
}
private Object[] createContextLocals() {
+ ContextLocal>[] contextLocals = LocalSeq.getArray();
if (contextLocals.length == 0) {
return EMPTY_CONTEXT_LOCALS;
} else {
@@ -951,7 +948,7 @@ public NameResolver nameResolver() {
@Override
public List> contextLocals() {
- return contextLocalsList;
+ return LocalSeq.getList();
}
@Override
@@ -1340,6 +1337,7 @@ public C createSharedResource(String resourceKey, String resourceName, Close
}
void duplicate(ContextBase src, ContextBase dst) {
+ ContextLocal>[] contextLocals = LocalSeq.getArray();
for (int i = 0;i < contextLocals.length;i++) {
ContextLocalImpl> contextLocal = (ContextLocalImpl>) contextLocals[i];
Object local = AccessMode.CONCURRENT.get(src.locals, i);
diff --git a/vertx-core/src/test/java/io/vertx/tests/context/ContextTest.java b/vertx-core/src/test/java/io/vertx/tests/context/ContextTest.java
index d3824bdd1a3..d40f2cc6ee2 100644
--- a/vertx-core/src/test/java/io/vertx/tests/context/ContextTest.java
+++ b/vertx-core/src/test/java/io/vertx/tests/context/ContextTest.java
@@ -1242,7 +1242,10 @@ public void testContextLocals() {
List> locals = ((VertxInternal) vertx).contextLocals();
assertSame(ContextInternal.LOCAL_MAP, locals.get(0));
assertSame(contextLocal, locals.get(1));
- assertSame(locals, ((VertxInternal) vertx).contextLocals());
+ List> localsAgain = ((VertxInternal) vertx).contextLocals();
+ assertNotSame(locals, localsAgain);
+ assertSame(ContextInternal.LOCAL_MAP, localsAgain.get(0));
+ assertSame(contextLocal, localsAgain.get(1));
}
@Test