From 2b2083fe8058c30cf0ba9f3f39902e41f95e0daa Mon Sep 17 00:00:00 2001 From: godotg Date: Sat, 25 Mar 2023 15:44:14 +0800 Subject: [PATCH] feat[map]: fast concurrent segment lock --- .../concurrent/ConcurrentHashMapLongObject.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/protocol/src/main/java/com/zfoo/protocol/collection/concurrent/ConcurrentHashMapLongObject.java b/protocol/src/main/java/com/zfoo/protocol/collection/concurrent/ConcurrentHashMapLongObject.java index 3ce66d8d..f194eacf 100644 --- a/protocol/src/main/java/com/zfoo/protocol/collection/concurrent/ConcurrentHashMapLongObject.java +++ b/protocol/src/main/java/com/zfoo/protocol/collection/concurrent/ConcurrentHashMapLongObject.java @@ -17,6 +17,7 @@ import io.netty.util.collection.LongObjectHashMap; import java.util.*; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.function.BiConsumer; /** @@ -168,6 +169,22 @@ public class ConcurrentHashMapLongObject implements Map { } } + @Override + public void forEach(BiConsumer action) { + for (var i = 0; i < buckets; i++) { + var readLock = locks[i].readLock(); + var map = maps.get(i); + readLock.lock(); + try { + for (var entry : map.entries()) { + action.accept(entry.key(), entry.value()); + } + } finally { + readLock.unlock(); + } + } + } + @Override public Set keySet() { throw new UnsupportedOperationException();