From e44e866ec2721a1a6b80527d2523daf89e669261 Mon Sep 17 00:00:00 2001 From: javasabr Date: Mon, 8 Sep 2025 18:59:28 +0200 Subject: [PATCH 1/3] working on concurrent module --- .../array/ArrayIterationFunctions.java | 4 + .../impl/DefaultArrayIterationFunctions.java | 11 + .../dictionary/DictionaryFactory.java | 21 +- .../LockableMutableRefDictionary.java | 9 + .../dictionary/MutableRefDictionary.java | 4 +- ...LockableMutableHashBasedRefDictionary.java | 103 +++++++ ...AbstractMutableHashBasedRefDictionary.java | 11 +- ...DefaultMutableHashBasedRefDictionary.java} | 16 +- ...ockBasedMutableHashBasedRefDictionary.java | 51 ++++ .../operation/LockableOperations.java | 11 + .../collections/operation/LockableSource.java | 13 + .../impl/DefaultLockableOperations.java | 19 ++ .../concurrent/deadlock/DeadLockDetector.java | 3 +- .../executor/PeriodicTaskExecutor.java | 29 -- .../concurrent/executor/TaskExecutor.java | 32 -- .../SingleThreadPeriodicTaskExecutor.java | 278 ------------------ .../impl/SingleThreadTaskExecutor.java | 219 -------------- .../executor/impl/ThreadPoolTaskExecutor.java | 220 -------------- .../common/concurrent/task/CallableTask.java | 25 -- .../common/concurrent/task/PeriodicTask.java | 35 --- .../common/concurrent/task/SimpleTask.java | 24 -- .../common/function/IntObjectConsumer.java | 21 -- .../javasabr/rlib/common/util/ArrayUtils.java | 21 -- .../rlib/common/util/ReflectionUtils.java | 226 ++------------ .../rlib/common/util/array/ArrayFactory.java | 15 - .../impl/ConcurrentAtomicARSWLockArray.java | 52 ---- .../ConcurrentAtomicARSWLockArraySet.java | 52 ---- .../impl/ConcurrentReentrantRWLockArray.java | 56 ---- .../ConcurrentReentrantRWLockArraySet.java | 52 ---- .../impl/ConcurrentStampedLockArray.java | 3 +- .../dictionary/AbstractIntegerDictionary.java | 11 - ...urrentAtomicARSWLockIntegerDictionary.java | 61 ---- ...oncurrentAtomicARSWLockLongDictionary.java | 66 ----- ...currentAtomicARSWLockObjectDictionary.java | 62 ---- .../ConcurrentIntegerDictionary.java | 10 - .../dictionary/ConcurrentLongDictionary.java | 10 - .../util/dictionary/DictionaryFactory.java | 30 -- .../util/dictionary/IntegerDictionary.java | 10 - .../rlib/common/util/ReflectionUtilsTest.java | 158 +++++++--- rlib-concurrent/build.gradle | 5 + .../executor/PeriodicTaskExecutor.java | 19 ++ .../concurrent/executor/TaskExecutor.java | 15 + .../SingleThreadPeriodicTaskExecutor.java | 238 +++++++++++++++ .../impl/SingleThreadTaskExecutor.java | 131 +++++++++ .../executor/impl/ThreadPoolTaskExecutor.java | 137 +++++++++ .../executor/impl/package-info.java | 4 + .../concurrent/executor}/package-info.java | 2 +- .../lock/AsyncReadSyncWriteLock.java | 2 +- .../rlib}/concurrent/lock/LockFactory.java | 10 +- .../rlib}/concurrent/lock/LockUtils.java | 2 +- .../rlib}/concurrent/lock/Lockable.java | 2 +- .../concurrent/lock/impl/AtomicLock.java | 2 +- .../lock/impl/AtomicReadWriteLock.java | 4 +- .../lock/impl/ReentrantARSWLock.java | 6 +- .../lock/impl/ReentrantAtomicLock.java | 2 +- .../rlib/concurrent/task/CallableTask.java | 19 ++ .../rlib/concurrent/task/PeriodicTask.java | 19 ++ .../rlib/concurrent/task/SimpleTask.java | 15 + .../rlib/concurrent/task/package-info.java | 4 + .../concurrent/util/ConcurrentUtils.java | 70 +---- .../rlib/concurrent/util/package-info.java | 4 + .../executor/TestThreadPoolTaskExecutor.java | 14 +- .../TestPrimitiveAtomicReadWriteLock.java | 19 +- .../rlib/functions/IntObjConsumer.java | 10 + .../rlib/functions/LongObjConsumer.java | 10 + ...LongFunction.java => ObjLongFunction.java} | 2 +- .../rlib/functions/ObjLongObjConsumer.java | 10 + .../rlib/functions/ObjObjLongConsumer.java | 10 + .../extension/ExtensionPointManager.java | 16 +- .../javasabr/rlib/reusable/pool/Pool.java | 4 +- settings.gradle | 3 +- 71 files changed, 1082 insertions(+), 1782 deletions(-) create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableMutableRefDictionary.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableMutableHashBasedRefDictionary.java rename rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/{DefaultMutableRefHashDictionary.java => DefaultMutableHashBasedRefDictionary.java} (82%) create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedMutableHashBasedRefDictionary.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/operation/LockableOperations.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/operation/LockableSource.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/operation/impl/DefaultLockableOperations.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/PeriodicTaskExecutor.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/TaskExecutor.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/SingleThreadTaskExecutor.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/ThreadPoolTaskExecutor.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/CallableTask.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/PeriodicTask.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/SimpleTask.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/function/IntObjectConsumer.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentAtomicARSWLockArray.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentAtomicARSWLockArraySet.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentReentrantRWLockArray.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentReentrantRWLockArraySet.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockIntegerDictionary.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockLongDictionary.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockObjectDictionary.java create mode 100644 rlib-concurrent/build.gradle create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/PeriodicTaskExecutor.java create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/TaskExecutor.java create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadTaskExecutor.java create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/ThreadPoolTaskExecutor.java create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/package-info.java rename {rlib-common/src/main/java/javasabr/rlib/common/concurrent/task => rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor}/package-info.java (54%) rename {rlib-common/src/main/java/javasabr/rlib/common => rlib-concurrent/src/main/java/javasabr/rlib}/concurrent/lock/AsyncReadSyncWriteLock.java (91%) rename {rlib-common/src/main/java/javasabr/rlib/common => rlib-concurrent/src/main/java/javasabr/rlib}/concurrent/lock/LockFactory.java (84%) rename {rlib-common/src/main/java/javasabr/rlib/common => rlib-concurrent/src/main/java/javasabr/rlib}/concurrent/lock/LockUtils.java (99%) rename {rlib-common/src/main/java/javasabr/rlib/common => rlib-concurrent/src/main/java/javasabr/rlib}/concurrent/lock/Lockable.java (83%) rename {rlib-common/src/main/java/javasabr/rlib/common => rlib-concurrent/src/main/java/javasabr/rlib}/concurrent/lock/impl/AtomicLock.java (97%) rename {rlib-common/src/main/java/javasabr/rlib/common => rlib-concurrent/src/main/java/javasabr/rlib}/concurrent/lock/impl/AtomicReadWriteLock.java (96%) rename {rlib-common/src/main/java/javasabr/rlib/common => rlib-concurrent/src/main/java/javasabr/rlib}/concurrent/lock/impl/ReentrantARSWLock.java (86%) rename {rlib-common/src/main/java/javasabr/rlib/common => rlib-concurrent/src/main/java/javasabr/rlib}/concurrent/lock/impl/ReentrantAtomicLock.java (97%) create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/CallableTask.java create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/PeriodicTask.java create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/SimpleTask.java create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/package-info.java rename {rlib-common/src/main/java/javasabr/rlib/common => rlib-concurrent/src/main/java/javasabr/rlib}/concurrent/util/ConcurrentUtils.java (58%) create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/util/package-info.java rename {rlib-common/src/test/java/javasabr/rlib/common => rlib-concurrent/src/test/java/javasabr/rlib}/concurrent/executor/TestThreadPoolTaskExecutor.java (73%) rename {rlib-common/src/test/java/javasabr/rlib/common => rlib-concurrent/src/test/java/javasabr/rlib}/concurrent/lock/TestPrimitiveAtomicReadWriteLock.java (84%) create mode 100644 rlib-functions/src/main/java/javasabr/rlib/functions/IntObjConsumer.java create mode 100644 rlib-functions/src/main/java/javasabr/rlib/functions/LongObjConsumer.java rename rlib-functions/src/main/java/javasabr/rlib/functions/{ObjectLongFunction.java => ObjLongFunction.java} (72%) create mode 100644 rlib-functions/src/main/java/javasabr/rlib/functions/ObjLongObjConsumer.java create mode 100644 rlib-functions/src/main/java/javasabr/rlib/functions/ObjObjLongConsumer.java diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayIterationFunctions.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayIterationFunctions.java index 98576969..857fbba0 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayIterationFunctions.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayIterationFunctions.java @@ -2,6 +2,8 @@ import java.util.function.BiConsumer; import java.util.function.BiPredicate; +import javasabr.rlib.functions.ObjLongObjConsumer; +import javasabr.rlib.functions.ObjObjLongConsumer; import javasabr.rlib.functions.TriConsumer; import org.jspecify.annotations.Nullable; @@ -14,5 +16,7 @@ public interface ArrayIterationFunctions { ArrayIterationFunctions forEach(F arg1, S arg2, TriConsumer consumer); + ArrayIterationFunctions forEach(F arg1, long arg2, ObjObjLongConsumer consumer); + boolean anyMatch(T arg1, BiPredicate filter); } diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/DefaultArrayIterationFunctions.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/DefaultArrayIterationFunctions.java index cc8c5a35..d8a2e793 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/DefaultArrayIterationFunctions.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/DefaultArrayIterationFunctions.java @@ -4,6 +4,7 @@ import java.util.function.BiPredicate; import javasabr.rlib.collections.array.ArrayIterationFunctions; import javasabr.rlib.collections.array.UnsafeArray; +import javasabr.rlib.functions.ObjObjLongConsumer; import javasabr.rlib.functions.TriConsumer; import org.jspecify.annotations.Nullable; @@ -44,6 +45,16 @@ public ArrayIterationFunctions forEach(F arg1, S arg2, TriConsumer ArrayIterationFunctions forEach(F arg1, long arg2, ObjObjLongConsumer consumer) { + @Nullable E[] wrapped = array.wrapped(); + int size = array.size(); + for (int i = 0; i < size; i++) { + consumer.accept(wrapped[i], arg1, arg2); + } + return this; + } + @Override public boolean anyMatch(T arg1, BiPredicate filter) { return findAny(arg1, filter) != null; diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/DictionaryFactory.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/DictionaryFactory.java index 58e140e3..4cb1b418 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/DictionaryFactory.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/DictionaryFactory.java @@ -1,17 +1,28 @@ package javasabr.rlib.collections.dictionary; -import javasabr.rlib.collections.dictionary.impl.DefaultMutableRefHashDictionary; +import javasabr.rlib.collections.dictionary.impl.DefaultMutableHashBasedRefDictionary; +import javasabr.rlib.collections.dictionary.impl.StampedLockBasedMutableHashBasedRefDictionary; import lombok.experimental.UtilityClass; @UtilityClass public class DictionaryFactory { public static MutableRefDictionary mutableRefDictionary() { - return new DefaultMutableRefHashDictionary<>(); + return new DefaultMutableHashBasedRefDictionary<>(); } public static MutableRefDictionary mutableRefDictionary( - Class keyType, - Class valueType) { - return new DefaultMutableRefHashDictionary<>(); + Class keyType, + Class valueType) { + return new DefaultMutableHashBasedRefDictionary<>(); + } + + public static LockableMutableRefDictionary lockableRefDictionary() { + return new StampedLockBasedMutableHashBasedRefDictionary<>(); + } + + public static LockableMutableRefDictionary lockableRefDictionary( + Class keyType, + Class valueType) { + return new StampedLockBasedMutableHashBasedRefDictionary<>(); } } diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableMutableRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableMutableRefDictionary.java new file mode 100644 index 00000000..f7c5a2b8 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableMutableRefDictionary.java @@ -0,0 +1,9 @@ +package javasabr.rlib.collections.dictionary; + +import javasabr.rlib.collections.operation.LockableOperations; +import javasabr.rlib.collections.operation.LockableSource; + +public interface LockableMutableRefDictionary extends MutableRefDictionary, LockableSource { + + LockableOperations> operations(); +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/MutableRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/MutableRefDictionary.java index 88f58c87..0a296a0a 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/MutableRefDictionary.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/MutableRefDictionary.java @@ -3,7 +3,7 @@ import java.util.Optional; import java.util.function.Function; import java.util.function.Supplier; -import javasabr.rlib.collections.dictionary.impl.DefaultMutableRefHashDictionary; +import javasabr.rlib.collections.dictionary.impl.DefaultMutableHashBasedRefDictionary; import org.jspecify.annotations.Nullable; public interface MutableRefDictionary extends RefDictionary { @@ -11,7 +11,7 @@ public interface MutableRefDictionary extends RefDictionary { static MutableRefDictionary ofTypes( Class keyType, Class valueType) { - return new DefaultMutableRefHashDictionary<>(); + return new DefaultMutableHashBasedRefDictionary<>(); } @Nullable diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableMutableHashBasedRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableMutableHashBasedRefDictionary.java new file mode 100644 index 00000000..2fa154cf --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableMutableHashBasedRefDictionary.java @@ -0,0 +1,103 @@ +package javasabr.rlib.collections.dictionary.impl; + +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; +import javasabr.rlib.collections.dictionary.LockableMutableRefDictionary; +import javasabr.rlib.collections.dictionary.RefDictionary; +import javasabr.rlib.collections.operation.LockableOperations; +import javasabr.rlib.collections.operation.impl.DefaultLockableOperations; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; + +@FieldDefaults(level = AccessLevel.PROTECTED) +public abstract class AbstractLockableMutableHashBasedRefDictionary extends + AbstractMutableHashBasedRefDictionary> implements + LockableMutableRefDictionary { + + final AtomicReference<@Nullable DefaultLinkedHashEntry[]> entries; + final AtomicInteger size; + + int threshold; + + public AbstractLockableMutableHashBasedRefDictionary() { + this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); + } + + public AbstractLockableMutableHashBasedRefDictionary(int initCapacity, float loadFactor) { + super(loadFactor); + //noinspection unchecked,rawtypes + this.entries = new AtomicReference<>(new DefaultLinkedHashEntry[initCapacity]); + this.size = new AtomicInteger(); + this.threshold = (int) (initCapacity * loadFactor); + } + + @Override + public boolean isEmpty() { + return size.get() < 1; + } + + @Override + public int size() { + return size.get(); + } + + @Override + protected int incrementSize() { + return size.incrementAndGet(); + } + + @Override + protected int decrementSize() { + return size.decrementAndGet(); + } + + @Override + protected void threshold(int threshold) { + this.threshold = threshold; + } + + @Override + protected int threshold() { + return threshold; + } + + @Override + protected void entries(@Nullable DefaultLinkedHashEntry[] entries) { + this.entries.set(entries); + } + + @Override + public @Nullable DefaultLinkedHashEntry[] entries() { + return entries.get(); + } + + @Override + protected DefaultLinkedHashEntry allocate( + int hash, + K key, + @Nullable V value, + @Nullable DefaultLinkedHashEntry next) { + return new DefaultLinkedHashEntry<>(next, key, value, hash); + } + + @Nullable + @Override + protected DefaultLinkedHashEntry[] allocate(int length) { + //noinspection unchecked + return new DefaultLinkedHashEntry[length]; + } + + @Override + public RefDictionary toReadOnly() { + @Nullable DefaultLinkedHashEntry[] currentEntries = entries.get(); + @Nullable DefaultLinkedHashEntry[] copied = Arrays.copyOf(currentEntries, currentEntries.length); + return new ImmutableHashBasedRefDictionary<>(copied, size.get()); + } + + @Override + public LockableOperations> operations() { + return new DefaultLockableOperations<>(this); + } +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractMutableHashBasedRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractMutableHashBasedRefDictionary.java index 6174b74a..a4ab095a 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractMutableHashBasedRefDictionary.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractMutableHashBasedRefDictionary.java @@ -7,8 +7,13 @@ import javasabr.rlib.collections.dictionary.MutableRefDictionary; import javasabr.rlib.collections.dictionary.RefDictionary; import javasabr.rlib.collections.dictionary.UnsafeMutableRefDictionary; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; import org.jspecify.annotations.Nullable; +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PROTECTED) public abstract class AbstractMutableHashBasedRefDictionary> extends AbstractHashBasedRefDictionary implements UnsafeMutableRefDictionary { @@ -16,6 +21,8 @@ public abstract class AbstractMutableHashBasedRefDictionary factory) { @@ -161,8 +168,6 @@ protected void addEntry(int hash, K key, @Nullable V value, int index) { protected abstract int threshold(); protected abstract void threshold(int threshold); - protected abstract float loadFactor(); - protected abstract int incrementSize(); protected abstract int decrementSize(); @@ -187,7 +192,7 @@ protected final void resize(int newLength) { transfer(currentEntries, newEntries); entries(newEntries); - threshold((int) (newLength * loadFactor())); + threshold((int) (newLength * loadFactor)); } protected void transfer( diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableRefHashDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableHashBasedRefDictionary.java similarity index 82% rename from rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableRefHashDictionary.java rename to rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableHashBasedRefDictionary.java index f9e71f5c..c2450e26 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableRefHashDictionary.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableHashBasedRefDictionary.java @@ -11,23 +11,22 @@ @Getter @Accessors(fluent = true) -@FieldDefaults(level = AccessLevel.PRIVATE) -public class DefaultMutableRefHashDictionary extends +@FieldDefaults(level = AccessLevel.PROTECTED) +public class DefaultMutableHashBasedRefDictionary extends AbstractMutableHashBasedRefDictionary> { - final float loadFactor; - @Nullable DefaultLinkedHashEntry[] entries; int size; int threshold; - public DefaultMutableRefHashDictionary() { + public DefaultMutableHashBasedRefDictionary() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); } - public DefaultMutableRefHashDictionary(int initCapacity, float loadFactor) { - this.entries = ArrayUtils.create(DefaultLinkedHashEntry.class, initCapacity); - this.loadFactor = loadFactor; + public DefaultMutableHashBasedRefDictionary(int initCapacity, float loadFactor) { + super(loadFactor); + //noinspection unchecked + this.entries = new DefaultLinkedHashEntry[initCapacity]; this.threshold = (int) (initCapacity * loadFactor); } @@ -36,7 +35,6 @@ public boolean isEmpty() { return size < 1; } - @Override protected int incrementSize() { return size++; diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedMutableHashBasedRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedMutableHashBasedRefDictionary.java new file mode 100644 index 00000000..e14d5c76 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedMutableHashBasedRefDictionary.java @@ -0,0 +1,51 @@ +package javasabr.rlib.collections.dictionary.impl; + +import java.util.concurrent.locks.StampedLock; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; + +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class StampedLockBasedMutableHashBasedRefDictionary extends + AbstractLockableMutableHashBasedRefDictionary { + + StampedLock stampedLock; + + public StampedLockBasedMutableHashBasedRefDictionary() { + this.stampedLock = new StampedLock(); + } + + public StampedLockBasedMutableHashBasedRefDictionary(int initCapacity, float loadFactor) { + super(initCapacity, loadFactor); + this.stampedLock = new StampedLock(); + } + + @Override + public long readLock() { + return stampedLock.readLock(); + } + + @Override + public void readUnlock(long stamp) { + stampedLock.unlockRead(stamp); + } + + @Override + public long tryOptimisticRead() { + return stampedLock.tryOptimisticRead(); + } + + @Override + public boolean validateLock(long stamp) { + return stampedLock.validate(stamp); + } + + @Override + public long writeLock() { + return stampedLock.writeLock(); + } + + @Override + public void writeUnlock(long stamp) { + stampedLock.unlockWrite(stamp); + } +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/operation/LockableOperations.java b/rlib-collections/src/main/java/javasabr/rlib/collections/operation/LockableOperations.java new file mode 100644 index 00000000..29bb5588 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/operation/LockableOperations.java @@ -0,0 +1,11 @@ +package javasabr.rlib.collections.operation; + +import java.util.function.BiFunction; +import java.util.function.Function; + +public interface LockableOperations { + + R getInReadLock(Function function); + + R getInReadLock(F arg1, BiFunction function); +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/operation/LockableSource.java b/rlib-collections/src/main/java/javasabr/rlib/collections/operation/LockableSource.java new file mode 100644 index 00000000..0d4eb78d --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/operation/LockableSource.java @@ -0,0 +1,13 @@ +package javasabr.rlib.collections.operation; + +public interface LockableSource { + + long readLock(); + void readUnlock(long stamp); + long tryOptimisticRead(); + + boolean validateLock(long stamp); + + long writeLock(); + void writeUnlock(long stamp); +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/operation/impl/DefaultLockableOperations.java b/rlib-collections/src/main/java/javasabr/rlib/collections/operation/impl/DefaultLockableOperations.java new file mode 100644 index 00000000..7c27e6e2 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/operation/impl/DefaultLockableOperations.java @@ -0,0 +1,19 @@ +package javasabr.rlib.collections.operation.impl; + +import java.util.function.BiFunction; +import java.util.function.Function; +import javasabr.rlib.collections.operation.LockableOperations; +import javasabr.rlib.collections.operation.LockableSource; + +public record DefaultLockableOperations(S source) implements LockableOperations { + + @Override + public R getInReadLock(Function function) { + return function.apply(source); + } + + @Override + public R getInReadLock(F arg1, BiFunction function) { + return function.apply(source, arg1); + } +} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockDetector.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockDetector.java index 2538714a..c5729eb8 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockDetector.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockDetector.java @@ -58,7 +58,8 @@ public DeadLockDetector(int interval) { throw new IllegalArgumentException("negative interval."); } - this.listeners = ArrayFactory.newConcurrentReentrantRWLockArray(DeadLockListener.class); + this.listeners = null; + // this.listeners = ArrayFactory.newConcurrentReentrantRWLockArray(DeadLockListener.class); this.mxThread = ManagementFactory.getThreadMXBean(); this.executorService = Executors.newSingleThreadScheduledExecutor(); this.interval = interval; diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/PeriodicTaskExecutor.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/PeriodicTaskExecutor.java deleted file mode 100644 index 82e19bdd..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/PeriodicTaskExecutor.java +++ /dev/null @@ -1,29 +0,0 @@ -package javasabr.rlib.common.concurrent.executor; - -import javasabr.rlib.common.concurrent.task.PeriodicTask; -import org.jspecify.annotations.NullMarked; - -/** - * The interface to implement a periodic task executor. - * - * @param the type parameter - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public interface PeriodicTaskExecutor, L> { - - /** - * Add a periodic task to execute. - * - * @param task the periodic task. - */ - void addTask(T task); - - /** - * Remove a periodic task from executing. - * - * @param task the periodic task. - */ - void removeTask(T task); -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/TaskExecutor.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/TaskExecutor.java deleted file mode 100644 index 5a0fae4f..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/TaskExecutor.java +++ /dev/null @@ -1,32 +0,0 @@ -package javasabr.rlib.common.concurrent.executor; - -import java.util.concurrent.Future; -import javasabr.rlib.common.concurrent.task.CallableTask; -import javasabr.rlib.common.concurrent.task.SimpleTask; -import org.jspecify.annotations.NullMarked; - -/** - * The interface to implement a task executor. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public interface TaskExecutor { - - /** - * Execute a simple task. - * - * @param task the simple task. - */ - void execute(SimpleTask task); - - /** - * Submit a callable task. - * - * @param the type parameter - * @param task the callable task. - * @return the reference to the task. - */ - Future submit(CallableTask task); -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java deleted file mode 100644 index 7351a587..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java +++ /dev/null @@ -1,278 +0,0 @@ -package javasabr.rlib.common.concurrent.executor.impl; - -import static java.util.Objects.requireNonNull; - -import java.lang.reflect.Constructor; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.Lock; -import java.util.function.Consumer; -import javasabr.rlib.common.concurrent.executor.PeriodicTaskExecutor; -import javasabr.rlib.common.concurrent.lock.LockFactory; -import javasabr.rlib.common.concurrent.lock.Lockable; -import javasabr.rlib.common.concurrent.task.PeriodicTask; -import javasabr.rlib.common.concurrent.util.ConcurrentUtils; -import javasabr.rlib.common.concurrent.util.ThreadUtils; -import javasabr.rlib.common.util.ClassUtils; -import javasabr.rlib.common.util.array.Array; -import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.logger.api.Logger; -import javasabr.rlib.logger.api.LoggerManager; -import lombok.AccessLevel; -import lombok.Getter; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The implementation of single thread periodic executor. - * - * @author JavaSaBr - */ -@NullMarked -@Getter(AccessLevel.PROTECTED) -public class SingleThreadPeriodicTaskExecutor, L> implements PeriodicTaskExecutor, - Runnable, Lockable { - - protected static final Logger LOGGER = LoggerManager.getLogger(SingleThreadPeriodicTaskExecutor.class); - - /** - * The list of waiting tasks. - */ - private final Array waitTasks; - - /** - * The list of executing tasks. - */ - private final Array executeTasks; - - /** - * The list of finished tasks. - */ - private final Array finishedTasks; - - /** - * The executor thread. - */ - private final Thread thread; - - /** - * The thread local objects. - */ - private final L localObjects; - - /** - * The finishing function. - */ - private final Consumer finishFunction = task -> task.onFinish(getLocalObjects()); - - /** - * The waiting flag. - */ - private final AtomicBoolean wait; - - /** - * The synchronizator. - */ - private final Lock lock; - - /** - * The update interval. - */ - private final int interval; - - public SingleThreadPeriodicTaskExecutor( - Class threadClass, - int priority, - int interval, - String name, - Class taskClass, - @Nullable L localObjects) { - this.waitTasks = ArrayFactory.newArray(taskClass); - this.executeTasks = ArrayFactory.newArray(taskClass); - this.finishedTasks = ArrayFactory.newArray(taskClass); - this.wait = new AtomicBoolean(); - this.lock = LockFactory.newAtomicLock(); - this.interval = interval; - - Constructor constructor = ClassUtils.getConstructor(threadClass, Runnable.class, String.class); - - this.thread = ClassUtils.newInstance(constructor, this, name); - this.thread.setPriority(priority); - this.thread.setDaemon(true); - this.localObjects = check(localObjects, thread); - this.thread.start(); - } - - @Override - public void addTask(T task) { - lock(); - try { - - waitTasks.add(task); - - if (wait.get()) { - synchronized (wait) { - if (wait.compareAndSet(true, false)) { - ConcurrentUtils.notifyAllInSynchronize(wait); - } - } - } - - } finally { - unlock(); - } - } - - protected L check(@Nullable L localObjects, Thread thread) { - return requireNonNull(localObjects); - } - - /** - * Execute tasks. - * - * @param executeTasks the execute tasks. - * @param finishedTasks the finished tasks. - * @param local the thread local objects. - * @param startExecuteTime the start time. - */ - protected void executeImpl(Array executeTasks, Array finishedTasks, L local, long startExecuteTime) { - for (var task : executeTasks.array()) { - - if (task == null) { - break; - } - - if (task.call(local, startExecuteTime) == Boolean.TRUE) { - finishedTasks.add(task); - } - } - } - - /** - * @return the update interval. - */ - public int getInterval() { - return interval; - } - - @Override - public void lock() { - lock.lock(); - } - - /** - * Handle tasks after executing. - * - * @param executedTasks the list of executed tasks. - * @param local the thread local objects. - * @param startExecuteTime the start executing time. - */ - protected void postExecute(Array executedTasks, L local, long startExecuteTime) { - } - - /** - * Handle tasks before executing. - * - * @param executeTasks the list of execute tasks. - * @param local the thread local objects. - * @param startExecuteTime the start executing time. - */ - protected void preExecute(Array executeTasks, L local, long startExecuteTime) { - } - - @Override - public void removeTask(T task) { - lock(); - try { - waitTasks.fastRemove(task); - } finally { - unlock(); - } - } - - @Override - public void run() { - - var waitTasks = getWaitTasks(); - var executeTasks = getExecuteTasks(); - var finishedTasks = getFinishedTasks(); - - var local = getLocalObjects(); - var interval = getInterval(); - - while (true) { - - executeTasks.clear(); - finishedTasks.clear(); - - lock(); - try { - - if (waitTasks.isEmpty()) { - wait.getAndSet(true); - } else { - executeTasks.addAll(waitTasks); - } - - } finally { - unlock(); - } - - if (wait.get()) { - synchronized (wait) { - if (wait.get()) { - ConcurrentUtils.waitInSynchronize(wait); - } - } - } - - if (executeTasks.isEmpty()) { - continue; - } - - var startExecuteTime = System.currentTimeMillis(); - - preExecute(executeTasks, local, startExecuteTime); - try { - executeImpl(executeTasks, finishedTasks, local, startExecuteTime); - } catch (Exception exc) { - LOGGER.warning(exc); - } finally { - postExecute(executeTasks, local, startExecuteTime); - } - - try { - - if (!finishedTasks.isEmpty()) { - lock(); - try { - waitTasks.removeAll(finishedTasks); - } finally { - unlock(); - } - - finishedTasks.forEach(finishFunction); - } - - } catch (Exception exc) { - LOGGER.warning(exc); - } - - if (interval < 1) { - continue; - } - - var result = interval - (int) (System.currentTimeMillis() - startExecuteTime); - - if (result < 1) { - continue; - } - - ThreadUtils.sleep(result); - } - } - - @Override - public void unlock() { - lock.unlock(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/SingleThreadTaskExecutor.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/SingleThreadTaskExecutor.java deleted file mode 100644 index d52a7161..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/SingleThreadTaskExecutor.java +++ /dev/null @@ -1,219 +0,0 @@ -package javasabr.rlib.common.concurrent.executor.impl; - -import static java.util.Objects.requireNonNull; - -import java.lang.reflect.Constructor; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.Lock; -import javasabr.rlib.common.concurrent.executor.TaskExecutor; -import javasabr.rlib.common.concurrent.lock.LockFactory; -import javasabr.rlib.common.concurrent.lock.Lockable; -import javasabr.rlib.common.concurrent.task.CallableTask; -import javasabr.rlib.common.concurrent.task.SimpleTask; -import javasabr.rlib.common.concurrent.util.ConcurrentUtils; -import javasabr.rlib.common.util.ClassUtils; -import javasabr.rlib.common.util.array.Array; -import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.logger.api.Logger; -import javasabr.rlib.logger.api.LoggerManager; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The implementation of single thread task executor. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class SingleThreadTaskExecutor implements TaskExecutor, Runnable, Lockable { - - protected static final Logger LOGGER = LoggerManager.getLogger(SingleThreadTaskExecutor.class); - - /** - * The list of waiting tasks. - */ - private final Array> waitTasks; - - /** - * The list of executing task. - */ - private final Array> executeTasks; - - /** - * The executor thread. - */ - private final Thread thread; - - /** - * The thread local objects. - */ - private final L localObjects; - - /** - * The waiting flag. - */ - private final AtomicBoolean wait; - - /** - * The synchronizer. - */ - private final Lock lock; - - public SingleThreadTaskExecutor( - Class threadClass, - int priority, - String name, - @Nullable L local) { - this.waitTasks = ArrayFactory.newArray(CallableTask.class); - this.executeTasks = ArrayFactory.newArray(CallableTask.class); - this.wait = new AtomicBoolean(); - this.lock = LockFactory.newAtomicLock(); - - Constructor constructor = ClassUtils.tryGetConstructor(threadClass, Runnable.class, String.class); - - this.thread = ClassUtils.newInstance(requireNonNull(constructor), this, name); - this.thread.setPriority(priority); - this.thread.setDaemon(true); - this.localObjects = check(local, thread); - this.thread.start(); - } - - /** - * Check l. - * - * @param local the local - * @param thread the thread - * @return the l - */ - protected L check(@Nullable L local, Thread thread) { - return requireNonNull(local); - } - - @Override - public void execute(final SimpleTask task) { - lock(); - try { - - waitTasks.add(task); - - if (wait.get()) { - synchronized (wait) { - if (wait.compareAndSet(true, false)) { - ConcurrentUtils.notifyAllInSynchronize(wait); - } - } - } - - } finally { - unlock(); - } - } - - /** - * Gets execute tasks. - * - * @return the list of executing task. - */ - protected Array> getExecuteTasks() { - return executeTasks; - } - - /** - * Gets local objects. - * - * @return the thread local objects. - */ - protected L getLocalObjects() { - return localObjects; - } - - /** - * Gets wait. - * - * @return the waiting flag. - */ - public AtomicBoolean getWait() { - return wait; - } - - /** - * Gets wait tasks. - * - * @return the list of waiting tasks. - */ - protected Array> getWaitTasks() { - return waitTasks; - } - - @Override - public void lock() { - lock.lock(); - } - - @Override - public void run() { - - Array> waitTasks = getWaitTasks(); - Array> executeTasks = getExecuteTasks(); - - L local = getLocalObjects(); - - while (true) { - - executeTasks.clear(); - - lock(); - try { - - if (waitTasks.isEmpty()) { - wait.getAndSet(true); - } else { - executeTasks.addAll(waitTasks); - waitTasks.clear(); - } - - } finally { - unlock(); - } - - if (wait.get()) { - synchronized (wait) { - if (wait.get()) { - ConcurrentUtils.waitInSynchronize(wait); - } - } - } - - if (executeTasks.isEmpty()) { - continue; - } - - try { - - long currentTime = System.currentTimeMillis(); - - for (CallableTask task : executeTasks.array()) { - if (task == null) { - break; - } - task.call(local, currentTime); - } - - } catch (final Exception e) { - LOGGER.warning(e); - } - } - } - - @Override - public Future submit(CallableTask task) { - throw new RuntimeException("not implemented."); - } - - @Override - public void unlock() { - lock.unlock(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/ThreadPoolTaskExecutor.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/ThreadPoolTaskExecutor.java deleted file mode 100644 index bdc6555b..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/executor/impl/ThreadPoolTaskExecutor.java +++ /dev/null @@ -1,220 +0,0 @@ -package javasabr.rlib.common.concurrent.executor.impl; - -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.locks.Lock; -import javasabr.rlib.common.concurrent.GroupThreadFactory; -import javasabr.rlib.common.concurrent.executor.TaskExecutor; -import javasabr.rlib.common.concurrent.lock.LockFactory; -import javasabr.rlib.common.concurrent.lock.Lockable; -import javasabr.rlib.common.concurrent.task.CallableTask; -import javasabr.rlib.common.concurrent.task.SimpleTask; -import javasabr.rlib.common.concurrent.util.ConcurrentUtils; -import javasabr.rlib.common.util.array.Array; -import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.common.util.linkedlist.LinkedList; -import javasabr.rlib.common.util.linkedlist.LinkedListFactory; -import javasabr.rlib.logger.api.Logger; -import javasabr.rlib.logger.api.LoggerManager; -import org.jspecify.annotations.NullMarked; - -/** - * Реализация многопоточного пакетного исполнителя задач. Использовать только в случае необходимости выполнять большое - * кол-во задач с минимальной нагрузкой на GC либо необходимости часто использовать локальные объекты, в остальных - * случаях рекамендуются {@link Executors} сервисы. Для получение локальных объектов, необходимо переопределить метод - * {@link #getLocalObjects(Thread)}. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class ThreadPoolTaskExecutor implements TaskExecutor, Runnable, Lockable { - - /** - * The constant LOGGER. - */ - protected static final Logger LOGGER = LoggerManager.getLogger(ThreadPoolTaskExecutor.class); - - /** - * The list of waiting tasks. - */ - private final LinkedList> waitTasks; - - /** - * The list of working threads. - */ - private final Array threads; - - /** - * The waiting flag. - */ - private final AtomicBoolean wait; - - /** - * The synchronizer. - */ - private final Lock lock; - - /** - * The count of executing tasks per thread. - */ - private final int packetSize; - - /** - * Instantiates a new Thread pool task executor. - * - * @param threadFactory the thread factory - * @param poolSize the pool size - * @param packetSize the packet size - */ - public ThreadPoolTaskExecutor( - GroupThreadFactory threadFactory, - int poolSize, - int packetSize) { - this.waitTasks = LinkedListFactory.newLinkedList(CallableTask.class); - this.wait = new AtomicBoolean(); - this.lock = LockFactory.newAtomicLock(); - this.threads = ArrayFactory.newArray(Thread.class); - this.packetSize = packetSize; - - for (int i = 0; i < poolSize; i++) { - - final Thread thread = threadFactory.newThread(this); - thread.setDaemon(true); - thread.start(); - - threads.add(thread); - } - } - - @Override - public void execute(SimpleTask task) { - lock(); - try { - - waitTasks.add(task); - - if (wait.get()) { - synchronized (wait) { - if (wait.compareAndSet(true, false)) { - ConcurrentUtils.notifyAllInSynchronize(wait); - } - } - } - - } finally { - unlock(); - } - } - - /** - * Get a local object container. - * - * @param thread the thread. - * @return the local object container of the thread. - */ - protected L getLocalObjects(Thread thread) { - throw new UnsupportedOperationException(); - } - - /** - * Gets packet size. - * - * @return the count of executing tasks per thread. - */ - public int getPacketSize() { - return packetSize; - } - - /** - * Gets wait. - * - * @return the waiting flag. - */ - protected AtomicBoolean getWait() { - return wait; - } - - /** - * Gets wait tasks. - * - * @return the list of waiting tasks. - */ - protected LinkedList> getWaitTasks() { - return waitTasks; - } - - @Override - public void lock() { - lock.lock(); - } - - @Override - public void run() { - - Thread thread = Thread.currentThread(); - - LinkedList> waitTasks = getWaitTasks(); - Array> executeTasks = ArrayFactory.newArray(CallableTask.class); - - L local = getLocalObjects(thread); - int packetSize = getPacketSize(); - - while (true) { - - executeTasks.clear(); - - lock(); - try { - - if (waitTasks.isEmpty()) { - wait.getAndSet(true); - } else { - for (int i = 0; i < packetSize && !waitTasks.isEmpty(); i++) { - executeTasks.add(waitTasks.poll()); - } - } - - } finally { - unlock(); - } - - if (executeTasks.isEmpty() && wait.get()) { - synchronized (wait) { - if (wait.get()) { - ConcurrentUtils.waitInSynchronize(wait); - } - } - } - - if (executeTasks.isEmpty()) { - continue; - } - try { - - long currentTime = System.currentTimeMillis(); - - for (CallableTask task : executeTasks.array()) { - if (task == null) { - break; - } - task.call(local, currentTime); - } - - } catch (Exception e) { - LOGGER.warning(e); - } - } - } - - @Override - public Future submit(CallableTask task) { - throw new RuntimeException("not implemented."); - } - - @Override - public void unlock() { - lock.unlock(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/CallableTask.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/CallableTask.java deleted file mode 100644 index 795dac85..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/CallableTask.java +++ /dev/null @@ -1,25 +0,0 @@ -package javasabr.rlib.common.concurrent.task; - -import org.jspecify.annotations.NonNull; -import org.jspecify.annotations.Nullable; - -/** - * The interface to implement a callable tasks. - * - * @param the type parameter - * @param the type parameter - * @author JavaSaBr - */ -@FunctionalInterface -public interface CallableTask { - - /** - * Execute this task. - * - * @param local the thread local container. - * @param currentTime the current time. - * @return the result. - */ - @Nullable - R call(@NonNull L local, long currentTime); -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/PeriodicTask.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/PeriodicTask.java deleted file mode 100644 index d1b4dce6..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/PeriodicTask.java +++ /dev/null @@ -1,35 +0,0 @@ -package javasabr.rlib.common.concurrent.task; - -/** - * The interface to implement a periodic tasks. - * - * @param the type parameter - * @author JavaSaBr - */ -public interface PeriodicTask extends CallableTask { - - @Override - default Boolean call(final L local, final long currentTime) { - if (update(local, currentTime)) { - return Boolean.TRUE; - } - return Boolean.FALSE; - } - - /** - * Notify about finishing this task. - * - * @param local the thread local container. - */ - default void onFinish(final L local) { - } - - /** - * Execute and update this task. - * - * @param local the thread local container. - * @param currentTime the current time. - * @return true if this task is finished. - */ - boolean update(L local, long currentTime); -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/SimpleTask.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/SimpleTask.java deleted file mode 100644 index 99667de0..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/SimpleTask.java +++ /dev/null @@ -1,24 +0,0 @@ -package javasabr.rlib.common.concurrent.task; - -/** - * The interface to implement a simple task. - * - * @param the type parameter - * @author JavaSaBr - */ -public interface SimpleTask extends CallableTask { - - @Override - default Void call(final L local, final long currentTime) { - execute(local, currentTime); - return null; - } - - /** - * Execute this task. - * - * @param local the thread local container. - * @param currentTime the current time. - */ - void execute(L local, long currentTime); -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/function/IntObjectConsumer.java b/rlib-common/src/main/java/javasabr/rlib/common/function/IntObjectConsumer.java deleted file mode 100644 index 34126dd2..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/function/IntObjectConsumer.java +++ /dev/null @@ -1,21 +0,0 @@ -package javasabr.rlib.common.function; - -import org.jspecify.annotations.Nullable; - -/** - * The function. - * - * @param the type parameter - * @author JavaSaBr - */ -@FunctionalInterface -public interface IntObjectConsumer { - - /** - * Accept. - * - * @param first the first - * @param second the second - */ - void accept(int first, @Nullable T second); -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ArrayUtils.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ArrayUtils.java index bde49cf6..f5aba019 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ArrayUtils.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/ArrayUtils.java @@ -13,7 +13,6 @@ import java.util.function.Supplier; import javasabr.rlib.common.function.CharSupplier; import javasabr.rlib.common.function.DoubleObjectConsumer; -import javasabr.rlib.common.function.IntObjectConsumer; import javasabr.rlib.common.function.ObjectIntPredicate; import javasabr.rlib.common.function.ObjectLongPredicate; import javasabr.rlib.common.function.TripleConsumer; @@ -1004,26 +1003,6 @@ public static void forEach( } } - /** - * Apply the consumer for each element of the array. - * - * @param the type parameter - * @param array the array. - * @param argument the additional argument. - * @param consumer the consumer. - */ - public static void forEach( - int @Nullable [] array, - @Nullable F argument, - IntObjectConsumer consumer) { - if (array == null || array.length < 1) { - return; - } - for (int element : array) { - consumer.accept(element, argument); - } - } - /** * Apply the consumer for each element of the array. * diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/ReflectionUtils.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ReflectionUtils.java index 38ea4acc..5cc648dd 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/ReflectionUtils.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/ReflectionUtils.java @@ -5,29 +5,20 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import javasabr.rlib.common.util.array.Array; -import org.jspecify.annotations.NullMarked; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import lombok.experimental.UtilityClass; import org.jspecify.annotations.Nullable; /** - * The class with utility reflection methods. - * * @author JavaSaBr */ -@NullMarked +@UtilityClass public final class ReflectionUtils { - /** - * Get all fields of the class. - * - * @param container the field container. - * @param startClass the class. - * @param lastClass the last class. - * @param declared the flag to get private fields as well. - * @param exceptions exception fields. - */ public static void addAllFields( - Array container, + Collection container, Class startClass, Class lastClass, boolean declared, @@ -46,53 +37,29 @@ public static void addAllFields( } if (exceptions.length < 1) { - container.addAll(fields); + container.addAll(Arrays.asList(fields)); } else { ArrayUtils.forEach(fields, toCheck -> !contains(exceptions, toCheck.getName()), container::add); } } } - /** - * Get all fields of a class. - * - * @param cs the class. - * @param exceptions exception fields. - * @return the all declared fields. - * @since 9.9.0 - */ - public static Array getAllDeclaredFields(Class cs, String... exceptions) { - var container = Array.ofType(Field.class); + public static Collection getAllDeclaredFields(Class cs, String... exceptions) { + var container = new ArrayList(); addAllFields(container, cs, Object.class, true, exceptions); return container; } - /** - * Get all fields of the class. - * - * @param cs the class. - * @param last the last class. - * @param declared the flag of getting private fields. - * @param exceptions exception fields. - * @return the all fields - */ - public static Array getAllFields( + public static Collection getAllFields( Class cs, Class last, boolean declared, String... exceptions) { - var container = Array.ofType(Field.class); + var container = new ArrayList(); addAllFields(container, cs, last, declared, exceptions); return container; } - /** - * Get a field by the name from the type. - * - * @param type the type. - * @param fieldName the field name. - * @return the field. - */ public static Field getField(Class type, String fieldName) { try { return type.getDeclaredField(fieldName); @@ -101,24 +68,11 @@ public static Field getField(Class type, String fieldName) { } } - /** - * Get a field by the name from the type of the object. - * - * @param object the object. - * @param fieldName the field name. - * @return the field. - */ public static Field getField(Object object, String fieldName) { return getField(object.getClass(), fieldName); } - /** - * Get a field by the name with full access from the type. - * - * @param type the type. - * @param fieldName the field name. - * @return the field. - */ + public static Field getUnsafeField(Class type, String fieldName) { try { Field field = getField(type, fieldName); @@ -129,26 +83,12 @@ public static Field getUnsafeField(Class type, String fieldName) { } } - /** - * Get a field by the name with full access. - * - * @param object the object. - * @param fieldName the field name. - * @return the field. - */ public static Field getUnsafeField(Object object, String fieldName) { return getUnsafeField(object.getClass(), fieldName); } - /** - * Get a field value by the field name. - * - * @param the result value's type. - * @param object the object. - * @param fieldName the field name. - * @return the value. - */ - public static @Nullable T getFiledValue(Object object, String fieldName) { + @Nullable + public static T getFiledValue(Object object, String fieldName) { try { Field field = getField(object, fieldName); return ClassUtils.unsafeCast(field.get(object)); @@ -157,15 +97,8 @@ public static Field getUnsafeField(Object object, String fieldName) { } } - /** - * Get a field value by the field name with full access. - * - * @param the result value's type. - * @param object the object. - * @param fieldName the field name. - * @return the value. - */ - public static @Nullable T getUnsafeFieldValue(final Object object, final String fieldName) { + @Nullable + public static T getUnsafeFieldValue(final Object object, final String fieldName) { try { final Field field = getUnsafeField(object, fieldName); return ClassUtils.unsafeCast(field.get(object)); @@ -174,15 +107,8 @@ public static Field getUnsafeField(Object object, String fieldName) { } } - /** - * Get a field value. - * - * @param the result value's type. - * @param object the object. - * @param field the field. - * @return the value. - */ - public static @Nullable T getFieldValue(Object object, Field field) { + @Nullable + public static T getFieldValue(Object object, Field field) { try { return ClassUtils.unsafeCast(field.get(object)); } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) { @@ -190,13 +116,6 @@ public static Field getUnsafeField(Object object, String fieldName) { } } - /** - * Set a field value. - * - * @param object the object. - * @param fieldName the field name. - * @param value the value. - */ public static void setFieldValue(Object object, String fieldName, Object value) { try { Field field = getField(object, fieldName); @@ -206,13 +125,6 @@ public static void setFieldValue(Object object, String fieldName, Object value) } } - /** - * Set a field value using full access. - * - * @param object the object. - * @param fieldName the field name. - * @param value the value. - */ public static void setUnsafeFieldValue(Object object, String fieldName, Object value) { try { Field field = getUnsafeField(object, fieldName); @@ -222,13 +134,6 @@ public static void setUnsafeFieldValue(Object object, String fieldName, Object v } } - /** - * Set a field value. - * - * @param object the object. - * @param field the field. - * @param value the value. - */ public static void setFieldValue(Object object, Field field, Object value) { try { field.set(object, value); @@ -237,13 +142,6 @@ public static void setFieldValue(Object object, Field field, Object value) { } } - /** - * Get a static field. - * - * @param type the class. - * @param fieldName the field name. - * @return the static field. - */ public static Field getStaticField(Class type, String fieldName) { try { return type.getDeclaredField(fieldName); @@ -252,13 +150,6 @@ public static Field getStaticField(Class type, String fieldName) { } } - /** - * Get a static field using full access. - * - * @param type the class. - * @param fieldName the field name. - * @return the static field. - */ public static Field getUnsafeStaticField(Class type, String fieldName) { try { Field field = getStaticField(type, fieldName); @@ -269,15 +160,8 @@ public static Field getUnsafeStaticField(Class type, String fieldName) { } } - /** - * Get a static field value. - * - * @param the type parameter - * @param type the class. - * @param fieldName the field name. - * @return the value. - */ - public static @Nullable T getStaticFieldValue(Class type, String fieldName) { + @Nullable + public static T getStaticFieldValue(Class type, String fieldName) { try { Field field = getStaticField(type, fieldName); return ClassUtils.unsafeCast(field.get(null)); @@ -286,15 +170,8 @@ public static Field getUnsafeStaticField(Class type, String fieldName) { } } - /** - * Get a static field value using full access. - * - * @param the type parameter - * @param type the class. - * @param fieldName the field name. - * @return the value. - */ - public static @Nullable T getUnsafeStaticFieldValue(Class type, String fieldName) { + @Nullable + public static T getUnsafeStaticFieldValue(Class type, String fieldName) { try { Field field = getUnsafeStaticField(type, fieldName); return ClassUtils.unsafeCast(field.get(null)); @@ -303,14 +180,8 @@ public static Field getUnsafeStaticField(Class type, String fieldName) { } } - /** - * Get a static field value. - * - * @param the type parameter - * @param field the field. - * @return the value. - */ - public static @Nullable T getStaticFieldValue(Field field) { + @Nullable + public static T getStaticFieldValue(Field field) { try { return ClassUtils.unsafeCast(field.get(null)); } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) { @@ -318,13 +189,6 @@ public static Field getUnsafeStaticField(Class type, String fieldName) { } } - /** - * Set a static field value. - * - * @param type the class. - * @param fieldName the field name. - * @param value the new value. - */ public static void setStaticFieldValue(Class type, String fieldName, Object value) { try { Field field = getStaticField(type, fieldName); @@ -334,17 +198,7 @@ public static void setStaticFieldValue(Class type, String fieldName, Object v } } - /** - * Set a static field value. - * - * @param type the class. - * @param fieldName thr field name. - * @param value the new value. - */ - public static void setUnsafeStaticFieldValue( - Class type, - String fieldName, - Object value) { + public static void setUnsafeStaticFieldValue(Class type, String fieldName, Object value) { try { Field field = getUnsafeStaticField(type, fieldName); field.set(null, value); @@ -353,12 +207,6 @@ public static void setUnsafeStaticFieldValue( } } - /** - * Change a static field value. - * - * @param field the field. - * @param value the new value. - */ public static void setStaticFieldValue(Field field, Object value) { try { field.set(null, value); @@ -367,14 +215,6 @@ public static void setStaticFieldValue(Field field, Object value) { } } - /** - * Get a method of the type by the method name and arg types. - * - * @param type the type. - * @param methodName the method name. - * @param argTypes the arg types. - * @return the found method. - */ public static Method getMethod(Class type, String methodName, Class... argTypes) { try { return type.getDeclaredMethod(methodName, argTypes); @@ -383,12 +223,6 @@ public static Method getMethod(Class type, String methodName, Class... arg } } - /** - * Call a void method of the object by the name. - * - * @param object the object. - * @param methodName the method name. - */ public static void callVoidMethod(Object object, String methodName) { try { getMethod(object.getClass(), methodName).invoke(object); @@ -397,12 +231,6 @@ public static void callVoidMethod(Object object, String methodName) { } } - /** - * Call a void method of the object by the name using full access. - * - * @param object the object. - * @param methodName the method name. - */ public static void callUnsafeVoidMethod(Object object, String methodName) { try { Method method = getMethod(object.getClass(), methodName); @@ -412,8 +240,4 @@ public static void callUnsafeVoidMethod(Object object, String methodName) { throw new RuntimeException(e); } } - - private ReflectionUtils() { - throw new IllegalArgumentException(); - } } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/ArrayFactory.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/ArrayFactory.java index 3cf831f7..1df46957 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/ArrayFactory.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/array/ArrayFactory.java @@ -3,9 +3,6 @@ import static javasabr.rlib.common.util.ClassUtils.unsafeNNCast; import javasabr.rlib.common.util.ArrayUtils; -import javasabr.rlib.common.util.array.impl.ConcurrentAtomicARSWLockArray; -import javasabr.rlib.common.util.array.impl.ConcurrentReentrantRWLockArray; -import javasabr.rlib.common.util.array.impl.ConcurrentReentrantRWLockArraySet; import javasabr.rlib.common.util.array.impl.ConcurrentStampedLockArray; import javasabr.rlib.common.util.array.impl.ConcurrentStampedLockArraySet; import javasabr.rlib.common.util.array.impl.CopyOnModifyArray; @@ -61,18 +58,6 @@ public static Array newArraySet(Class type) { return new FastArraySet<>(type); } - public static ConcurrentArray newConcurrentReentrantRWLockArray(Class type) { - return new ConcurrentReentrantRWLockArray<>(type); - } - - public static ConcurrentArray newConcurrentReentrantRWLockArraySet(Class type) { - return new ConcurrentReentrantRWLockArraySet<>(type); - } - - public static ConcurrentArray newConcurrentAtomicARSWLockArray(Class type) { - return new ConcurrentAtomicARSWLockArray<>(type); - } - public static ConcurrentArray newConcurrentStampedLockArray(Class type) { return new ConcurrentStampedLockArray<>(type); } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentAtomicARSWLockArray.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentAtomicARSWLockArray.java deleted file mode 100644 index 04b0027b..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentAtomicARSWLockArray.java +++ /dev/null @@ -1,52 +0,0 @@ -package javasabr.rlib.common.util.array.impl; - -import javasabr.rlib.common.concurrent.lock.AsyncReadSyncWriteLock; -import javasabr.rlib.common.concurrent.lock.LockFactory; -import javasabr.rlib.common.util.array.ConcurrentArray; -import org.jspecify.annotations.NullMarked; - -/** - * The concurrent implementation of the array using {@link LockFactory#newReentrantARSWLock()} for - * {@link ConcurrentArray#readLock()}* and {@link ConcurrentArray#writeLock()}. - * - * @param the array's element type. - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentAtomicARSWLockArray extends AbstractConcurrentArray { - - private static final long serialVersionUID = -6291504312637658721L; - - private final AsyncReadSyncWriteLock lock; - - public ConcurrentAtomicARSWLockArray(Class type) { - this(type, 10); - } - - public ConcurrentAtomicARSWLockArray(Class type, int size) { - super(type, size); - this.lock = LockFactory.newAtomicARSWLock(); - } - - @Override - public final long readLock() { - lock.asyncLock(); - return 1; - } - - @Override - public void readUnlock(long stamp) { - lock.asyncUnlock(); - } - - @Override - public final long writeLock() { - lock.syncLock(); - return 1; - } - - @Override - public void writeUnlock(long stamp) { - lock.syncUnlock(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentAtomicARSWLockArraySet.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentAtomicARSWLockArraySet.java deleted file mode 100644 index 183f9485..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentAtomicARSWLockArraySet.java +++ /dev/null @@ -1,52 +0,0 @@ -package javasabr.rlib.common.util.array.impl; - -import javasabr.rlib.common.concurrent.lock.LockFactory; -import javasabr.rlib.common.util.array.Array; -import javasabr.rlib.common.util.array.ConcurrentArray; -import org.jspecify.annotations.NullMarked; - -/** - * The concurrent implementation of the array without duplications using {@link LockFactory#newAtomicARSWLock()} for - * {@link ConcurrentArray#readLock()} and {@link ConcurrentArray#writeLock()}. - * - * @param the array's element type. - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentAtomicARSWLockArraySet extends ConcurrentAtomicARSWLockArray { - - private static final long serialVersionUID = -3394386864246350866L; - - public ConcurrentAtomicARSWLockArraySet(Class type) { - super(type); - } - - public ConcurrentAtomicARSWLockArraySet(Class type, int size) { - super(type, size); - } - - @Override - public boolean add(E element) { - return !contains(element) && super.add(element); - } - - @Override - protected void processAdd(Array elements, int selfSize, int targetSize) { - var array = elements.array(); - for (int i = 0, length = elements.size(); i < length; i++) { - E element = array[i]; - if (!contains(element)) { - unsafeAdd(element); - } - } - } - - @Override - protected void processAdd(E[] elements, int selfSize, int targetSize) { - for (E element : elements) { - if (!contains(element)) { - unsafeAdd(element); - } - } - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentReentrantRWLockArray.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentReentrantRWLockArray.java deleted file mode 100644 index 16f06ca5..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentReentrantRWLockArray.java +++ /dev/null @@ -1,56 +0,0 @@ -package javasabr.rlib.common.util.array.impl; - -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import javasabr.rlib.common.concurrent.lock.LockFactory; -import javasabr.rlib.common.util.array.ConcurrentArray; -import org.jspecify.annotations.NullMarked; - -/** - * The concurrent implementation of the array using {@link ReentrantReadWriteLock} for - * {@link ConcurrentArray#readLock()}* and {@link ConcurrentArray#writeLock()}. - * - * @param the array's element type. - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentReentrantRWLockArray extends AbstractConcurrentArray { - - private static final long serialVersionUID = -7985171224116955303L; - - private final Lock readLock; - private final Lock writeLock; - - public ConcurrentReentrantRWLockArray(Class type) { - this(type, 10); - } - - public ConcurrentReentrantRWLockArray(Class type, int size) { - super(type, size); - var readWriteLock = LockFactory.newReentrantRWLock(); - this.readLock = readWriteLock.readLock(); - this.writeLock = readWriteLock.writeLock(); - } - - @Override - public final long readLock() { - readLock.lock(); - return 1; - } - - @Override - public final void readUnlock(long stamp) { - readLock.unlock(); - } - - @Override - public final long writeLock() { - writeLock.lock(); - return 1; - } - - @Override - public final void writeUnlock(long stamp) { - writeLock.unlock(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentReentrantRWLockArraySet.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentReentrantRWLockArraySet.java deleted file mode 100644 index 98346d42..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentReentrantRWLockArraySet.java +++ /dev/null @@ -1,52 +0,0 @@ -package javasabr.rlib.common.util.array.impl; - -import java.util.concurrent.locks.ReentrantReadWriteLock; -import javasabr.rlib.common.util.array.Array; -import javasabr.rlib.common.util.array.ConcurrentArray; -import org.jspecify.annotations.NullMarked; - -/** - * The concurrent implementation of the array without duplications using {@link ReentrantReadWriteLock} for - * {@link ConcurrentArray#readLock()}* and {@link ConcurrentArray#writeLock()}. - * - * @param the array's element type. - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentReentrantRWLockArraySet extends ConcurrentReentrantRWLockArray { - - private static final long serialVersionUID = -3394386864246350866L; - - public ConcurrentReentrantRWLockArraySet(Class type) { - super(type); - } - - public ConcurrentReentrantRWLockArraySet(Class type, int size) { - super(type, size); - } - - @Override - public boolean add(E element) { - return !contains(element) && super.add(element); - } - - @Override - protected void processAdd(Array elements, int selfSize, int targetSize) { - var array = elements.array(); - for (int i = 0, length = elements.size(); i < length; i++) { - E element = array[i]; - if (!contains(element)) { - unsafeAdd(element); - } - } - } - - @Override - protected void processAdd(E[] elements, int selfSize, int targetSize) { - for (E element : elements) { - if (!contains(element)) { - unsafeAdd(element); - } - } - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentStampedLockArray.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentStampedLockArray.java index fbc088d2..7b0edcb1 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentStampedLockArray.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/array/impl/ConcurrentStampedLockArray.java @@ -1,7 +1,6 @@ package javasabr.rlib.common.util.array.impl; import java.util.concurrent.locks.StampedLock; -import javasabr.rlib.common.concurrent.lock.LockFactory; import javasabr.rlib.common.util.array.ConcurrentArray; import org.jspecify.annotations.NullMarked; @@ -25,7 +24,7 @@ public ConcurrentStampedLockArray(Class type) { public ConcurrentStampedLockArray(Class type, int size) { super(type, size); - this.lock = LockFactory.newStampedLock(); + this.lock = new StampedLock(); } @Override diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractIntegerDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractIntegerDictionary.java index aa11d09f..3439f7b6 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractIntegerDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/AbstractIntegerDictionary.java @@ -5,7 +5,6 @@ import java.util.function.IntFunction; import java.util.function.Supplier; import javasabr.rlib.common.function.IntBiObjectConsumer; -import javasabr.rlib.common.function.IntObjectConsumer; import javasabr.rlib.common.util.ClassUtils; import javasabr.rlib.common.util.array.IntegerArray; import javasabr.rlib.common.util.array.MutableIntegerArray; @@ -63,16 +62,6 @@ public final boolean containsKey(int key) { return getEntry(key) != null; } - @Override - public void forEach(IntObjectConsumer consumer) { - for (var entry : entries()) { - while (entry != null) { - consumer.accept(entry.getKey(), entry.getValue()); - entry = entry.getNext(); - } - } - } - @Override public void forEach( T argument, diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockIntegerDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockIntegerDictionary.java deleted file mode 100644 index 9b943a0a..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockIntegerDictionary.java +++ /dev/null @@ -1,61 +0,0 @@ -package javasabr.rlib.common.util.dictionary; - -import javasabr.rlib.common.concurrent.lock.AsyncReadSyncWriteLock; -import javasabr.rlib.common.concurrent.lock.LockFactory; -import org.jspecify.annotations.NullMarked; - -/** - * The implementation of the {@link ConcurrentIntegerDictionary} using {@link LockFactory#newAtomicARSWLock()}*. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentAtomicARSWLockIntegerDictionary extends AbstractConcurrentIntegerDictionary { - - /** - * The lock. - */ - private final AsyncReadSyncWriteLock lock; - - public ConcurrentAtomicARSWLockIntegerDictionary() { - this.lock = LockFactory.newAtomicARSWLock(); - } - - public ConcurrentAtomicARSWLockIntegerDictionary(float loadFactor) { - super(loadFactor); - this.lock = LockFactory.newAtomicARSWLock(); - } - - public ConcurrentAtomicARSWLockIntegerDictionary(float loadFactor, int initCapacity) { - super(loadFactor, initCapacity); - this.lock = LockFactory.newAtomicARSWLock(); - } - - public ConcurrentAtomicARSWLockIntegerDictionary(int initCapacity) { - super(initCapacity); - this.lock = LockFactory.newAtomicARSWLock(); - } - - @Override - public long readLock() { - lock.asyncLock(); - return 0; - } - - @Override - public void readUnlock(long stamp) { - lock.asyncUnlock(); - } - - @Override - public void writeUnlock(long stamp) { - lock.syncUnlock(); - } - - @Override - public long writeLock() { - lock.syncLock(); - return 0; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockLongDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockLongDictionary.java deleted file mode 100644 index 588d5e46..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockLongDictionary.java +++ /dev/null @@ -1,66 +0,0 @@ -package javasabr.rlib.common.util.dictionary; - -import javasabr.rlib.common.concurrent.lock.AsyncReadSyncWriteLock; -import javasabr.rlib.common.concurrent.lock.LockFactory; -import org.jspecify.annotations.NullMarked; - -/** - * The implementation of the {@link ConcurrentLongDictionary} using {@link LockFactory#newAtomicARSWLock()}*. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentAtomicARSWLockLongDictionary extends AbstractConcurrentLongDictionary { - - /** - * The lock. - */ - private final AsyncReadSyncWriteLock lock; - - public ConcurrentAtomicARSWLockLongDictionary() { - this.lock = LockFactory.newAtomicARSWLock(); - } - - public ConcurrentAtomicARSWLockLongDictionary(float loadFactor) { - super(loadFactor); - this.lock = LockFactory.newAtomicARSWLock(); - } - - public ConcurrentAtomicARSWLockLongDictionary(float loadFactor, int initCapacity) { - super(loadFactor, initCapacity); - this.lock = LockFactory.newAtomicARSWLock(); - } - - /** - * Instantiates a new Concurrent atomic arsw lock long dictionary. - * - * @param initCapacity the init capacity - */ - public ConcurrentAtomicARSWLockLongDictionary(final int initCapacity) { - super(initCapacity); - this.lock = LockFactory.newAtomicARSWLock(); - } - - @Override - public long readLock() { - lock.asyncLock(); - return 0; - } - - @Override - public void readUnlock(final long stamp) { - lock.asyncUnlock(); - } - - @Override - public void writeUnlock(final long stamp) { - lock.syncUnlock(); - } - - @Override - public long writeLock() { - lock.syncLock(); - return 0; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockObjectDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockObjectDictionary.java deleted file mode 100644 index c70f04a8..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentAtomicARSWLockObjectDictionary.java +++ /dev/null @@ -1,62 +0,0 @@ -package javasabr.rlib.common.util.dictionary; - -import javasabr.rlib.common.concurrent.lock.AsyncReadSyncWriteLock; -import javasabr.rlib.common.concurrent.lock.LockFactory; -import org.jspecify.annotations.NullMarked; - -/** - * The implementation of the {@link ConcurrentObjectDictionary} using {@link LockFactory#newAtomicARSWLock()}*. - * - * @param the key's type. - * @param the value's type. - * @author JavaSaBr - */ -@NullMarked -public class ConcurrentAtomicARSWLockObjectDictionary extends AbstractConcurrentObjectDictionary { - - /** - * The lock. - */ - private final AsyncReadSyncWriteLock lock; - - public ConcurrentAtomicARSWLockObjectDictionary() { - this.lock = LockFactory.newAtomicARSWLock(); - } - - public ConcurrentAtomicARSWLockObjectDictionary(float loadFactor) { - super(loadFactor); - this.lock = LockFactory.newAtomicARSWLock(); - } - - public ConcurrentAtomicARSWLockObjectDictionary(float loadFactor, int initCapacity) { - super(loadFactor, initCapacity); - this.lock = LockFactory.newAtomicARSWLock(); - } - - public ConcurrentAtomicARSWLockObjectDictionary(int initCapacity) { - super(initCapacity); - this.lock = LockFactory.newAtomicARSWLock(); - } - - @Override - public long readLock() { - lock.asyncLock(); - return 0; - } - - @Override - public void readUnlock(long stamp) { - lock.asyncUnlock(); - } - - @Override - public void writeUnlock(long stamp) { - lock.syncUnlock(); - } - - @Override - public long writeLock() { - lock.syncLock(); - return 0; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentIntegerDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentIntegerDictionary.java index 85004309..79750e1e 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentIntegerDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentIntegerDictionary.java @@ -11,14 +11,4 @@ @NullMarked public interface ConcurrentIntegerDictionary extends IntegerDictionary, ConcurrentDictionary { - /** - * Create a new concurrent integer dictionary for the value's type. - * - * @param valueType the value's type. - * @param the value's type. - * @return the new concurrent integer dictionary. - */ - static ConcurrentIntegerDictionary ofType(Class valueType) { - return DictionaryFactory.newConcurrentAtomicIntegerDictionary(); - } } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentLongDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentLongDictionary.java index 476e8691..14462e34 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentLongDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentLongDictionary.java @@ -11,14 +11,4 @@ @NullMarked public interface ConcurrentLongDictionary extends LongDictionary, ConcurrentDictionary { - /** - * Create a new concurrent long dictionary for the value's type. - * - * @param valueType the value's type. - * @param the value's type. - * @return the new concurrent long dictionary. - */ - static ConcurrentLongDictionary ofType(Class valueType) { - return DictionaryFactory.newConcurrentAtomicLongDictionary(); - } } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/DictionaryFactory.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/DictionaryFactory.java index 09e1efc7..7f544bdb 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/DictionaryFactory.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/DictionaryFactory.java @@ -13,36 +13,6 @@ public final class DictionaryFactory { public static final ObjectDictionary EMPTY_OD = new ReadOnlyFastObjectDictionary<>(); public static final LongDictionary EMPTY_LD = new ReadOnlyFastLongDictionary<>(); - public static ConcurrentIntegerDictionary newConcurrentAtomicIntegerDictionary() { - return new ConcurrentAtomicARSWLockIntegerDictionary<>(); - } - - public static ConcurrentIntegerDictionary newConcurrentAtomicIntegerDictionary( - float loadFactor, - int initCapacity) { - return new ConcurrentAtomicARSWLockIntegerDictionary<>(loadFactor, initCapacity); - } - - public static ConcurrentLongDictionary newConcurrentAtomicLongDictionary() { - return new ConcurrentAtomicARSWLockLongDictionary<>(); - } - - public static ConcurrentLongDictionary newConcurrentAtomicLongDictionary( - float loadFactor, - int initCapacity) { - return new ConcurrentAtomicARSWLockLongDictionary<>(loadFactor, initCapacity); - } - - public static ConcurrentObjectDictionary newConcurrentAtomicObjectDictionary() { - return new ConcurrentAtomicARSWLockObjectDictionary<>(); - } - - public static ConcurrentObjectDictionary newConcurrentAtomicObjectDictionary( - float loadFactor, - int initCapacity) { - return new ConcurrentAtomicARSWLockObjectDictionary<>(loadFactor, initCapacity); - } - public static ConcurrentObjectDictionary newConcurrentStampedLockObjectDictionary() { return new ConcurrentStampedLockObjectDictionary<>(); } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/IntegerDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/IntegerDictionary.java index eaa824e1..8883ea4f 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/IntegerDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/IntegerDictionary.java @@ -4,7 +4,6 @@ import java.util.function.IntFunction; import java.util.function.Supplier; import javasabr.rlib.common.function.IntBiObjectConsumer; -import javasabr.rlib.common.function.IntObjectConsumer; import javasabr.rlib.common.util.array.ArrayFactory; import javasabr.rlib.common.util.array.IntegerArray; import javasabr.rlib.common.util.array.MutableIntegerArray; @@ -172,15 +171,6 @@ default IntegerArray keyArray(MutableIntegerArray container) { throw new UnsupportedOperationException(); } - /** - * Performs the given action for each key-value pair of this dictionary. - * - * @param consumer the consumer. - */ - default void forEach(IntObjectConsumer consumer) { - throw new UnsupportedOperationException(); - } - /** * Performs the given action for each key-value pair of this dictionary. * diff --git a/rlib-common/src/test/java/javasabr/rlib/common/util/ReflectionUtilsTest.java b/rlib-common/src/test/java/javasabr/rlib/common/util/ReflectionUtilsTest.java index 964577ee..18a55cb6 100644 --- a/rlib-common/src/test/java/javasabr/rlib/common/util/ReflectionUtilsTest.java +++ b/rlib-common/src/test/java/javasabr/rlib/common/util/ReflectionUtilsTest.java @@ -33,62 +33,124 @@ void getAllDeclaredFieldsTest() { var allFields = ReflectionUtils.getAllDeclaredFields(Type1.class); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field1"))); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field2"))); - assertNull(allFields.findAny(object -> object - .getName() - .equals("field3"))); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field1")) + .findAny() + .orElse(null)); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field2")) + .findAny() + .orElse(null)); + assertNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field3")) + .findAny() + .orElse(null)); allFields = ReflectionUtils.getAllDeclaredFields(Type2.class); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field1"))); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field2"))); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field3"))); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field4"))); - assertNull(allFields.findAny(object -> object - .getName() - .equals("field5"))); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field1")) + .findAny() + .orElse(null)); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field2")) + .findAny() + .orElse(null)); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field3")) + .findAny() + .orElse(null)); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field4")) + .findAny() + .orElse(null)); + assertNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field5")) + .findAny() + .orElse(null)); allFields = ReflectionUtils.getAllDeclaredFields(Type1.Inner1.class); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field1"))); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field2"))); - assertNull(allFields.findAny(object -> object - .getName() - .equals("field3"))); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field1")) + .findAny() + .orElse(null)); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field2"))); + assertNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field3")) + .findAny() + .orElse(null)); allFields = ReflectionUtils.getAllDeclaredFields(Type1.Inner2.class); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field1"))); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field2"))); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field3"))); - assertNotNull(allFields.findAny(object -> object - .getName() - .equals("field4"))); - assertNull(allFields.findAny(object -> object - .getName() - .equals("field5"))); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field1")) + .findAny() + .orElse(null)); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field2")) + .findAny() + .orElse(null)); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field3")) + .findAny() + .orElse(null)); + assertNotNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field4")) + .findAny() + .orElse(null)); + assertNull(allFields + .stream() + .filter(object -> object + .getName() + .equals("field5")) + .findAny() + .orElse(null)); } } diff --git a/rlib-concurrent/build.gradle b/rlib-concurrent/build.gradle new file mode 100644 index 00000000..db4c8ef6 --- /dev/null +++ b/rlib-concurrent/build.gradle @@ -0,0 +1,5 @@ + +dependencies { + api projects.rlibCollections + testImplementation projects.rlibLoggerImpl +} \ No newline at end of file diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/PeriodicTaskExecutor.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/PeriodicTaskExecutor.java new file mode 100644 index 00000000..66cc8455 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/PeriodicTaskExecutor.java @@ -0,0 +1,19 @@ +package javasabr.rlib.concurrent.executor; + +import java.util.Collection; +import javasabr.rlib.collections.array.Array; +import javasabr.rlib.concurrent.task.PeriodicTask; + +/** + * @author JavaSaBr + */ +public interface PeriodicTaskExecutor, L> { + + void registerTask(T task); + + void registerTasks(Array tasks); + + void registerTasks(Collection tasks); + + void unregisterTask(T task); +} diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/TaskExecutor.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/TaskExecutor.java new file mode 100644 index 00000000..f4c6dfc2 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/TaskExecutor.java @@ -0,0 +1,15 @@ +package javasabr.rlib.concurrent.executor; + +import java.util.concurrent.CompletionStage; +import javasabr.rlib.concurrent.task.CallableTask; +import javasabr.rlib.concurrent.task.SimpleTask; + +/** + * @author JavaSaBr + */ +public interface TaskExecutor { + + void execute(SimpleTask task); + + CompletionStage submit(CallableTask task); +} diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java new file mode 100644 index 00000000..9e20b265 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java @@ -0,0 +1,238 @@ +package javasabr.rlib.concurrent.executor.impl; + +import static java.util.Objects.requireNonNull; + +import java.util.Collection; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.Lock; +import java.util.function.BiFunction; +import javasabr.rlib.collections.array.Array; +import javasabr.rlib.collections.array.ArrayFactory; +import javasabr.rlib.collections.array.MutableArray; +import javasabr.rlib.concurrent.executor.PeriodicTaskExecutor; +import javasabr.rlib.concurrent.lock.LockFactory; +import javasabr.rlib.concurrent.lock.Lockable; +import javasabr.rlib.concurrent.task.PeriodicTask; +import javasabr.rlib.concurrent.util.ConcurrentUtils; +import javasabr.rlib.common.concurrent.util.ThreadUtils; +import javasabr.rlib.functions.LongObjConsumer; +import javasabr.rlib.logger.api.Logger; +import javasabr.rlib.logger.api.LoggerManager; +import lombok.AccessLevel; +import lombok.experimental.Accessors; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; + +/** + * @author JavaSaBr + */ +@Accessors(fluent = true, chain = false) +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class SingleThreadPeriodicTaskExecutor, L> implements + PeriodicTaskExecutor, Runnable, Lockable { + + protected static final Logger LOGGER = LoggerManager.getLogger(SingleThreadPeriodicTaskExecutor.class); + + MutableArray waitTasks; + MutableArray executeTasks; + MutableArray finishedTasks; + + Thread thread; + L local; + LongObjConsumer finishFunction; + + AtomicBoolean wait; + Lock lock; + int interval; + + public SingleThreadPeriodicTaskExecutor( + int priority, + int interval, + String name, + BiFunction threadFactory, + Class taskClass, + L local) { + this.waitTasks = ArrayFactory.mutableArray(taskClass); + this.executeTasks = ArrayFactory.mutableArray(taskClass); + this.finishedTasks = ArrayFactory.mutableArray(taskClass); + this.wait = new AtomicBoolean(); + this.lock = LockFactory.newAtomicLock(); + this.interval = interval; + this.thread = threadFactory.apply(this, name); + this.thread.setPriority(priority); + this.thread.setDaemon(true); + this.local = check(local, thread); + this.thread.start(); + this.finishFunction = (cycleTime, task) -> task.onFinish(local, cycleTime); + } + + @Override + public void registerTask(T task) { + lock(); + try { + waitTasks.add(task); + if (wait.get()) { + synchronized (wait) { + if (wait.compareAndSet(true, false)) { + ConcurrentUtils.notifyAllInSynchronize(wait); + } + } + } + } finally { + unlock(); + } + } + + @Override + public void registerTasks(Array tasks) { + lock(); + try { + waitTasks.addAll(tasks); + if (wait.get()) { + synchronized (wait) { + if (wait.compareAndSet(true, false)) { + ConcurrentUtils.notifyAllInSynchronize(wait); + } + } + } + } finally { + unlock(); + } + } + + @Override + public void registerTasks(Collection tasks) { + lock(); + try { + waitTasks.addAll(tasks); + if (wait.get()) { + synchronized (wait) { + if (wait.compareAndSet(true, false)) { + ConcurrentUtils.notifyAllInSynchronize(wait); + } + } + } + } finally { + unlock(); + } + } + + protected L check(L localObjects, Thread thread) { + return requireNonNull(localObjects); + } + + protected void executeImpl( + Array executeTasks, + MutableArray finishedTasks, + L local, + long startExecuteTime) { + + @Nullable T[] unsafe = executeTasks + .asUnsafe() + .wrapped(); + + for (int i = 0, length = executeTasks.size(); i < length; i++) { + T task = unsafe[i]; + if (task.call(local, startExecuteTime)) { + finishedTasks.add(task); + } + } + } + + protected void postExecute(Array executedTasks, L local, long startExecuteTime) {} + protected void preExecute(Array executeTasks, L local, long startExecuteTime) {} + + @Override + public void unregisterTask(T task) { + lock(); + try { + waitTasks.remove(task); + } finally { + unlock(); + } + } + + @Override + public void run() { + + MutableArray tasksToExecute = ArrayFactory.mutableArray(waitTasks.type()); + MutableArray finishedTasks = ArrayFactory.mutableArray(waitTasks.type()); + + while (true) { + tasksToExecute.clear(); + finishedTasks.clear(); + lock(); + try { + if (waitTasks.isEmpty()) { + wait.getAndSet(true); + } else { + tasksToExecute.addAll(waitTasks); + } + } finally { + unlock(); + } + + if (wait.get()) { + synchronized (wait) { + if (wait.get()) { + ConcurrentUtils.waitInSynchronize(wait); + } + } + } + + if (tasksToExecute.isEmpty()) { + continue; + } + + long startExecuteTime = System.currentTimeMillis(); + + preExecute(tasksToExecute, local, startExecuteTime); + try { + executeImpl(tasksToExecute, finishedTasks, local, startExecuteTime); + } catch (Exception exc) { + LOGGER.warning(exc); + } finally { + postExecute(tasksToExecute, local, startExecuteTime); + } + + try { + + if (!finishedTasks.isEmpty()) { + lock(); + try { + waitTasks.removeAll(finishedTasks); + } finally { + unlock(); + } + finishedTasks + .iterations() + .forEach(local, startExecuteTime, PeriodicTask::onFinish); + } + + } catch (Exception exc) { + LOGGER.warning(exc); + } + + if (interval < 1) { + continue; + } + + int result = interval - (int) (System.currentTimeMillis() - startExecuteTime); + if (result < 1) { + continue; + } + + ThreadUtils.sleep(result); + } + } + + @Override + public void lock() { + lock.lock(); + } + + @Override + public void unlock() { + lock.unlock(); + } +} diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadTaskExecutor.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadTaskExecutor.java new file mode 100644 index 00000000..b8baaa70 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadTaskExecutor.java @@ -0,0 +1,131 @@ +package javasabr.rlib.concurrent.executor.impl; + +import static java.util.Objects.requireNonNull; + +import java.util.concurrent.CompletionStage; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.Lock; +import java.util.function.BiFunction; +import javasabr.rlib.collections.array.ArrayFactory; +import javasabr.rlib.collections.array.MutableArray; +import javasabr.rlib.concurrent.executor.TaskExecutor; +import javasabr.rlib.concurrent.lock.LockFactory; +import javasabr.rlib.concurrent.lock.Lockable; +import javasabr.rlib.concurrent.task.CallableTask; +import javasabr.rlib.concurrent.task.SimpleTask; +import javasabr.rlib.concurrent.util.ConcurrentUtils; +import javasabr.rlib.logger.api.Logger; +import javasabr.rlib.logger.api.LoggerManager; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; + +/** + * @author JavaSaBr + */ +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class SingleThreadTaskExecutor implements TaskExecutor, Runnable, Lockable { + + protected static final Logger LOGGER = LoggerManager.getLogger(SingleThreadTaskExecutor.class); + + MutableArray> waitTasks; + + Thread thread; + L local; + AtomicBoolean wait; + Lock lock; + + public SingleThreadTaskExecutor( + int priority, + String name, + BiFunction threadFactory, + L local) { + this.waitTasks = ArrayFactory.mutableArray(CallableTask.class); + this.wait = new AtomicBoolean(); + this.lock = LockFactory.newAtomicLock(); + this.thread = threadFactory.apply(this, name); + this.thread.setPriority(priority); + this.thread.setDaemon(true); + this.local = check(local, thread); + this.thread.start(); + } + + protected L check(L local, Thread thread) { + return requireNonNull(local); + } + + @Override + public void execute(SimpleTask task) { + lock(); + try { + waitTasks.add(task); + if (wait.get()) { + synchronized (wait) { + if (wait.compareAndSet(true, false)) { + ConcurrentUtils.notifyAllInSynchronize(wait); + } + } + } + } finally { + unlock(); + } + } + + @Override + public void run() { + + MutableArray> executeTasks = ArrayFactory.mutableArray(CallableTask.class); + + while (true) { + executeTasks.clear(); + lock(); + try { + + if (waitTasks.isEmpty()) { + wait.getAndSet(true); + } else { + executeTasks.addAll(waitTasks); + waitTasks.clear(); + } + + } finally { + unlock(); + } + + if (wait.get()) { + synchronized (wait) { + if (wait.get()) { + ConcurrentUtils.waitInSynchronize(wait); + } + } + } + + if (executeTasks.isEmpty()) { + continue; + } + + try { + executeTasks + .iterations() + .forEach(local, System.currentTimeMillis(), CallableTask::call); + } catch (final Exception e) { + LOGGER.warning(e); + } + } + } + + @Override + public CompletionStage submit(CallableTask task) { + throw new UnsupportedOperationException(); + } + + @Override + public void lock() { + lock.lock(); + } + + @Override + public void unlock() { + lock.unlock(); + } +} diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/ThreadPoolTaskExecutor.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/ThreadPoolTaskExecutor.java new file mode 100644 index 00000000..8e20bcd0 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/ThreadPoolTaskExecutor.java @@ -0,0 +1,137 @@ +package javasabr.rlib.concurrent.executor.impl; + +import java.util.concurrent.CompletionStage; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.Lock; +import java.util.function.Function; +import javasabr.rlib.collections.array.ArrayFactory; +import javasabr.rlib.collections.array.MutableArray; +import javasabr.rlib.common.concurrent.GroupThreadFactory; +import javasabr.rlib.concurrent.executor.TaskExecutor; +import javasabr.rlib.concurrent.lock.LockFactory; +import javasabr.rlib.concurrent.lock.Lockable; +import javasabr.rlib.concurrent.task.CallableTask; +import javasabr.rlib.concurrent.task.SimpleTask; +import javasabr.rlib.concurrent.util.ConcurrentUtils; +import javasabr.rlib.common.util.linkedlist.LinkedList; +import javasabr.rlib.common.util.linkedlist.LinkedListFactory; +import javasabr.rlib.logger.api.Logger; +import javasabr.rlib.logger.api.LoggerManager; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; + +/** + * @author JavaSaBr + */ +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class ThreadPoolTaskExecutor implements TaskExecutor, Runnable, Lockable { + + protected static final Logger LOGGER = LoggerManager.getLogger(ThreadPoolTaskExecutor.class); + + LinkedList> waitTasks; + MutableArray threads; + + Function localObjectsFactory; + AtomicBoolean wait; + Lock lock; + int packetSize; + + public ThreadPoolTaskExecutor( + GroupThreadFactory threadFactory, + Function localObjectsFactory, + int poolSize, + int packetSize) { + this.localObjectsFactory = localObjectsFactory; + this.waitTasks = LinkedListFactory.newLinkedList(CallableTask.class); + this.wait = new AtomicBoolean(); + this.lock = LockFactory.newAtomicLock(); + this.threads = ArrayFactory.mutableArray(Thread.class); + this.packetSize = packetSize; + + for (int i = 0; i < poolSize; i++) { + + Thread thread = threadFactory.newThread(this); + thread.setDaemon(true); + thread.start(); + + threads.add(thread); + } + } + + @Override + public void execute(SimpleTask task) { + lock(); + try { + waitTasks.add(task); + if (wait.get()) { + synchronized (wait) { + if (wait.compareAndSet(true, false)) { + ConcurrentUtils.notifyAllInSynchronize(wait); + } + } + } + } finally { + unlock(); + } + } + + @Override + public void run() { + + Thread thread = Thread.currentThread(); + MutableArray> executeTasks = ArrayFactory.mutableArray(CallableTask.class); + L local = localObjectsFactory.apply(thread); + + while (true) { + executeTasks.clear(); + lock(); + try { + if (waitTasks.isEmpty()) { + wait.getAndSet(true); + } else { + for (int i = 0; i < packetSize && !waitTasks.isEmpty(); i++) { + executeTasks.add(waitTasks.poll()); + } + } + } finally { + unlock(); + } + + if (executeTasks.isEmpty() && wait.get()) { + synchronized (wait) { + if (wait.get()) { + ConcurrentUtils.waitInSynchronize(wait); + } + } + } + + if (executeTasks.isEmpty()) { + continue; + } + + try { + executeTasks + .iterations() + .forEach(local, System.currentTimeMillis(), CallableTask::call); + } catch (Exception e) { + LOGGER.warning(e); + } + } + } + + @Override + public CompletionStage submit(CallableTask task) { + throw new UnsupportedOperationException(); + } + + @Override + public void lock() { + lock.lock(); + } + + @Override + public void unlock() { + lock.unlock(); + } +} diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/package-info.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/package-info.java new file mode 100644 index 00000000..0ca2e397 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.concurrent.executor.impl; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/package-info.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/package-info.java similarity index 54% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/package-info.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/package-info.java index 2f56d368..92e11b2e 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/task/package-info.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/package-info.java @@ -1,4 +1,4 @@ @NullMarked -package javasabr.rlib.common.concurrent.task; +package javasabr.rlib.concurrent.executor; import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/AsyncReadSyncWriteLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/AsyncReadSyncWriteLock.java similarity index 91% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/AsyncReadSyncWriteLock.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/AsyncReadSyncWriteLock.java index 264f85d7..31291862 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/AsyncReadSyncWriteLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/AsyncReadSyncWriteLock.java @@ -1,4 +1,4 @@ -package javasabr.rlib.common.concurrent.lock; +package javasabr.rlib.concurrent.lock; /** * The interface for implementing async reading and sync writing lock. diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/LockFactory.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockFactory.java similarity index 84% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/LockFactory.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockFactory.java index 00bbd9a2..464c8afb 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/LockFactory.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockFactory.java @@ -1,14 +1,14 @@ -package javasabr.rlib.common.concurrent.lock; +package javasabr.rlib.concurrent.lock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.StampedLock; -import javasabr.rlib.common.concurrent.lock.impl.AtomicLock; -import javasabr.rlib.common.concurrent.lock.impl.AtomicReadWriteLock; -import javasabr.rlib.common.concurrent.lock.impl.ReentrantARSWLock; -import javasabr.rlib.common.concurrent.lock.impl.ReentrantAtomicLock; +import javasabr.rlib.concurrent.lock.impl.AtomicLock; +import javasabr.rlib.concurrent.lock.impl.AtomicReadWriteLock; +import javasabr.rlib.concurrent.lock.impl.ReentrantARSWLock; +import javasabr.rlib.concurrent.lock.impl.ReentrantAtomicLock; import org.jspecify.annotations.NullMarked; /** diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/LockUtils.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockUtils.java similarity index 99% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/LockUtils.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockUtils.java index 0ce473a2..f780cbb0 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/LockUtils.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockUtils.java @@ -1,4 +1,4 @@ -package javasabr.rlib.common.concurrent.lock; +package javasabr.rlib.concurrent.lock; import java.util.concurrent.locks.Lock; import java.util.function.BiConsumer; diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/Lockable.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/Lockable.java similarity index 83% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/Lockable.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/Lockable.java index 8d9a8c34..6825923f 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/Lockable.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/Lockable.java @@ -1,4 +1,4 @@ -package javasabr.rlib.common.concurrent.lock; +package javasabr.rlib.concurrent.lock; /** * The interface to mark a object that it has a lock/unlock methods. diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicLock.java similarity index 97% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicLock.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicLock.java index 819e8ac2..9611bd60 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicLock.java @@ -1,4 +1,4 @@ -package javasabr.rlib.common.concurrent.lock.impl; +package javasabr.rlib.concurrent.lock.impl; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicReadWriteLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicReadWriteLock.java similarity index 96% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicReadWriteLock.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicReadWriteLock.java index 82a535cd..a4f6a517 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/AtomicReadWriteLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicReadWriteLock.java @@ -1,10 +1,10 @@ -package javasabr.rlib.common.concurrent.lock.impl; +package javasabr.rlib.concurrent.lock.impl; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; -import javasabr.rlib.common.concurrent.lock.AsyncReadSyncWriteLock; +import javasabr.rlib.concurrent.lock.AsyncReadSyncWriteLock; import org.jspecify.annotations.NullMarked; /** diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantARSWLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantARSWLock.java similarity index 86% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantARSWLock.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantARSWLock.java index 54eae40b..02048bb5 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantARSWLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantARSWLock.java @@ -1,10 +1,10 @@ -package javasabr.rlib.common.concurrent.lock.impl; +package javasabr.rlib.concurrent.lock.impl; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import javasabr.rlib.common.concurrent.lock.AsyncReadSyncWriteLock; -import javasabr.rlib.common.concurrent.lock.LockFactory; +import javasabr.rlib.concurrent.lock.AsyncReadSyncWriteLock; +import javasabr.rlib.concurrent.lock.LockFactory; import org.jspecify.annotations.NullMarked; /** diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantAtomicLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantAtomicLock.java similarity index 97% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantAtomicLock.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantAtomicLock.java index ca5c5345..537a5cde 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/lock/impl/ReentrantAtomicLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantAtomicLock.java @@ -1,4 +1,4 @@ -package javasabr.rlib.common.concurrent.lock.impl; +package javasabr.rlib.concurrent.lock.impl; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/CallableTask.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/CallableTask.java new file mode 100644 index 00000000..cdb17a48 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/CallableTask.java @@ -0,0 +1,19 @@ +package javasabr.rlib.concurrent.task; + +import org.jspecify.annotations.Nullable; + +/** + * @author JavaSaBr + */ +@FunctionalInterface +public interface CallableTask { + + /** + * + * @param local the container of thread local objects + * @param cycleTime the start time of executing package of tasks iteration + * @return the task result. + */ + @Nullable + R call(L local, long cycleTime); +} diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/PeriodicTask.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/PeriodicTask.java new file mode 100644 index 00000000..26c24ef6 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/PeriodicTask.java @@ -0,0 +1,19 @@ +package javasabr.rlib.concurrent.task; + +/** + * @author JavaSaBr + */ +public interface PeriodicTask extends CallableTask { + + @Override + default Boolean call(L local, long cycleTime) { + if (update(local, cycleTime)) { + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + default void onFinish(L local, long cycleTime) {} + + boolean update(L local, long cycleTime); +} diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/SimpleTask.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/SimpleTask.java new file mode 100644 index 00000000..249d6cde --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/SimpleTask.java @@ -0,0 +1,15 @@ +package javasabr.rlib.concurrent.task; + +/** + * @author JavaSaBr + */ +public interface SimpleTask extends CallableTask { + + @Override + default Void call(L local, long cycleTime) { + execute(local, cycleTime); + return null; + } + + void execute(L local, long cycleTime); +} diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/package-info.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/package-info.java new file mode 100644 index 00000000..bb47dfa5 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/task/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.concurrent.task; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ConcurrentUtils.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/util/ConcurrentUtils.java similarity index 58% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ConcurrentUtils.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/util/ConcurrentUtils.java index 75ac431e..97b231af 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ConcurrentUtils.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/util/ConcurrentUtils.java @@ -1,48 +1,31 @@ -package javasabr.rlib.common.concurrent.util; +package javasabr.rlib.concurrent.util; import java.util.function.Function; -import javasabr.rlib.common.concurrent.lock.Lockable; import javasabr.rlib.common.function.ObjectIntFunction; +import javasabr.rlib.concurrent.lock.Lockable; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; -import org.jspecify.annotations.NullMarked; +import lombok.experimental.UtilityClass; import org.jspecify.annotations.Nullable; /** - * THe utility class with methods to work in concurrent cases. - * * @author JavaSaBr */ -@NullMarked +@UtilityClass public final class ConcurrentUtils { private static final Logger LOGGER = LoggerManager.getLogger(ConcurrentUtils.class); - /** - * Notify all threads. - * - * @param object the object - */ public static void notifyAll(Object object) { synchronized (object) { object.notifyAll(); } } - /** - * Notify all threads from a synchronized block. - * - * @param object the object - */ public static void notifyAllInSynchronize(Object object) { object.notifyAll(); } - /** - * Notify all threads and wait. - * - * @param object the object - */ public static void notifyAndWait(Object object) { synchronized (object) { notifyAllInSynchronize(object); @@ -50,11 +33,6 @@ public static void notifyAndWait(Object object) { } } - /** - * Wait. - * - * @param object the object - */ public static void wait(Object object) { synchronized (object) { try { @@ -65,12 +43,6 @@ public static void wait(Object object) { } } - /** - * Wait. - * - * @param object the object. - * @param time the time in ms. - */ public static void wait(Object object, long time) { synchronized (object) { try { @@ -81,11 +53,6 @@ public static void wait(Object object, long time) { } } - /** - * Wait from a synchronized block. - * - * @param object the object - */ public static void waitInSynchronize(Object object) { try { object.wait(); @@ -94,12 +61,6 @@ public static void waitInSynchronize(Object object) { } } - /** - * Wait from a synchronized block. - * - * @param object the object. - * @param time the time in ms. - */ public static void waitInSynchronize(Object object, long time) { try { object.wait(time); @@ -108,15 +69,6 @@ public static void waitInSynchronize(Object object, long time) { } } - /** - * Apply a function in locked block. - * - * @param the type parameter - * @param the type parameter - * @param sync the synchronizer. - * @param function the function. - * @return the result from the function. - */ @Nullable public static R get(T sync, Function function) { sync.lock(); @@ -127,16 +79,6 @@ public static R get(T sync, Function fun } } - /** - * Apply a function in locked block. - * - * @param the type parameter - * @param the type parameter - * @param sync the synchronizer. - * @param argument the argument. - * @param function the function. - * @return the result from the function. - */ @Nullable public static R get(T sync, int argument, ObjectIntFunction function) { sync.lock(); @@ -146,8 +88,4 @@ public static R get(T sync, int argument, ObjectIntFunct sync.unlock(); } } - - private ConcurrentUtils() { - throw new RuntimeException(); - } } diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/util/package-info.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/util/package-info.java new file mode 100644 index 00000000..f3309167 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/util/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.concurrent.util; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-common/src/test/java/javasabr/rlib/common/concurrent/executor/TestThreadPoolTaskExecutor.java b/rlib-concurrent/src/test/java/javasabr/rlib/concurrent/executor/TestThreadPoolTaskExecutor.java similarity index 73% rename from rlib-common/src/test/java/javasabr/rlib/common/concurrent/executor/TestThreadPoolTaskExecutor.java rename to rlib-concurrent/src/test/java/javasabr/rlib/concurrent/executor/TestThreadPoolTaskExecutor.java index dd870060..271b80fc 100644 --- a/rlib-common/src/test/java/javasabr/rlib/common/concurrent/executor/TestThreadPoolTaskExecutor.java +++ b/rlib-concurrent/src/test/java/javasabr/rlib/concurrent/executor/TestThreadPoolTaskExecutor.java @@ -1,14 +1,12 @@ -package javasabr.rlib.common.concurrent.executor; +package javasabr.rlib.concurrent.executor; import java.util.concurrent.atomic.AtomicInteger; import javasabr.rlib.common.concurrent.GroupThreadFactory; -import javasabr.rlib.common.concurrent.executor.impl.ThreadPoolTaskExecutor; import javasabr.rlib.common.concurrent.util.ThreadUtils; +import javasabr.rlib.concurrent.executor.impl.ThreadPoolTaskExecutor; import org.junit.jupiter.api.Assertions; /** - * Реализация теста многопоточного исполнителя задач. - * * @author JavaSaBr */ public class TestThreadPoolTaskExecutor { @@ -22,13 +20,7 @@ public void test() { System.out.println(header + " start test executor..."); final GroupThreadFactory factory = new GroupThreadFactory("test_executor", Thread::new, Thread.NORM_PRIORITY); - final TaskExecutor executor = new ThreadPoolTaskExecutor(factory, 5, 5) { - - @Override - protected Object getLocalObjects(final Thread thread) { - return new Object(); - } - }; + final TaskExecutor executor = new ThreadPoolTaskExecutor<>(factory, thread -> new Object(), 5, 5); final AtomicInteger counter = new AtomicInteger(); diff --git a/rlib-common/src/test/java/javasabr/rlib/common/concurrent/lock/TestPrimitiveAtomicReadWriteLock.java b/rlib-concurrent/src/test/java/javasabr/rlib/concurrent/lock/TestPrimitiveAtomicReadWriteLock.java similarity index 84% rename from rlib-common/src/test/java/javasabr/rlib/common/concurrent/lock/TestPrimitiveAtomicReadWriteLock.java rename to rlib-concurrent/src/test/java/javasabr/rlib/concurrent/lock/TestPrimitiveAtomicReadWriteLock.java index 707b3198..6728bbc0 100644 --- a/rlib-common/src/test/java/javasabr/rlib/common/concurrent/lock/TestPrimitiveAtomicReadWriteLock.java +++ b/rlib-concurrent/src/test/java/javasabr/rlib/concurrent/lock/TestPrimitiveAtomicReadWriteLock.java @@ -1,23 +1,10 @@ -package javasabr.rlib.common.concurrent.lock; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import javasabr.rlib.common.concurrent.lock.impl.AtomicReadWriteLock; -import javasabr.rlib.common.concurrent.lock.impl.ReentrantARSWLock; -import javasabr.rlib.common.concurrent.util.ThreadUtils; +package javasabr.rlib.concurrent.lock; /** - * Тест функционала блокировщика. - * * @author JavaSaBr */ public class TestPrimitiveAtomicReadWriteLock { - +/* public void test() throws InterruptedException, ExecutionException { final String header = TestPrimitiveAtomicReadWriteLock.class.getSimpleName() + ": "; @@ -139,5 +126,5 @@ private long testImpl(final ExecutorService service, final AsyncReadSyncWriteLoc } return System.currentTimeMillis() - time; - } + }*/ } diff --git a/rlib-functions/src/main/java/javasabr/rlib/functions/IntObjConsumer.java b/rlib-functions/src/main/java/javasabr/rlib/functions/IntObjConsumer.java new file mode 100644 index 00000000..f4ddae74 --- /dev/null +++ b/rlib-functions/src/main/java/javasabr/rlib/functions/IntObjConsumer.java @@ -0,0 +1,10 @@ +package javasabr.rlib.functions; + +/** + * @author JavaSaBr + */ +@FunctionalInterface +public interface IntObjConsumer { + + void accept(int arg1, T arg2); +} diff --git a/rlib-functions/src/main/java/javasabr/rlib/functions/LongObjConsumer.java b/rlib-functions/src/main/java/javasabr/rlib/functions/LongObjConsumer.java new file mode 100644 index 00000000..d4fc4d11 --- /dev/null +++ b/rlib-functions/src/main/java/javasabr/rlib/functions/LongObjConsumer.java @@ -0,0 +1,10 @@ +package javasabr.rlib.functions; + +/** + * @author JavaSaBr + */ +@FunctionalInterface +public interface LongObjConsumer { + + void accept(long arg1, T arg2); +} diff --git a/rlib-functions/src/main/java/javasabr/rlib/functions/ObjectLongFunction.java b/rlib-functions/src/main/java/javasabr/rlib/functions/ObjLongFunction.java similarity index 72% rename from rlib-functions/src/main/java/javasabr/rlib/functions/ObjectLongFunction.java rename to rlib-functions/src/main/java/javasabr/rlib/functions/ObjLongFunction.java index 2c87e2cf..071eaec6 100644 --- a/rlib-functions/src/main/java/javasabr/rlib/functions/ObjectLongFunction.java +++ b/rlib-functions/src/main/java/javasabr/rlib/functions/ObjLongFunction.java @@ -4,7 +4,7 @@ * @author JavaSaBr */ @FunctionalInterface -public interface ObjectLongFunction { +public interface ObjLongFunction { R apply(T arg1, long arg2); } diff --git a/rlib-functions/src/main/java/javasabr/rlib/functions/ObjLongObjConsumer.java b/rlib-functions/src/main/java/javasabr/rlib/functions/ObjLongObjConsumer.java new file mode 100644 index 00000000..c901313d --- /dev/null +++ b/rlib-functions/src/main/java/javasabr/rlib/functions/ObjLongObjConsumer.java @@ -0,0 +1,10 @@ +package javasabr.rlib.functions; + +@FunctionalInterface +public interface ObjLongObjConsumer { + + /** + * Performs this operation on the given arguments. + */ + void accept(F arg1, long arg2, T arg3); +} diff --git a/rlib-functions/src/main/java/javasabr/rlib/functions/ObjObjLongConsumer.java b/rlib-functions/src/main/java/javasabr/rlib/functions/ObjObjLongConsumer.java new file mode 100644 index 00000000..6aa1397e --- /dev/null +++ b/rlib-functions/src/main/java/javasabr/rlib/functions/ObjObjLongConsumer.java @@ -0,0 +1,10 @@ +package javasabr.rlib.functions; + +@FunctionalInterface +public interface ObjObjLongConsumer { + + /** + * Performs this operation on the given arguments. + */ + void accept(F arg1, S arg2, long arg3); +} diff --git a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/extension/ExtensionPointManager.java b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/extension/ExtensionPointManager.java index 5ae155ed..a6f32ae5 100644 --- a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/extension/ExtensionPointManager.java +++ b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/extension/ExtensionPointManager.java @@ -1,9 +1,9 @@ package javasabr.rlib.plugin.system.extension; +import javasabr.rlib.collections.dictionary.Dictionary; +import javasabr.rlib.collections.dictionary.DictionaryFactory; +import javasabr.rlib.collections.dictionary.LockableMutableRefDictionary; import javasabr.rlib.common.util.ClassUtils; -import javasabr.rlib.common.util.dictionary.ConcurrentObjectDictionary; -import javasabr.rlib.common.util.dictionary.DictionaryFactory; -import javasabr.rlib.common.util.dictionary.ObjectDictionary; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; import lombok.AccessLevel; @@ -27,10 +27,10 @@ public static ExtensionPoint register(String id) { return getInstance().create(id); } - ConcurrentObjectDictionary> extensionPoints; + LockableMutableRefDictionary> extensionPoints; public ExtensionPointManager() { - this.extensionPoints = DictionaryFactory.newConcurrentAtomicObjectDictionary(); + this.extensionPoints = DictionaryFactory.lockableRefDictionary(); } public ExtensionPoint create(String id) { @@ -41,7 +41,6 @@ public ExtensionPoint create(String id) { LOGGER.warning(id, "Extension point:[%s] is already registered"::formatted); return ClassUtils.unsafeNNCast(exists); } - var extensionPoint = new ExtensionPoint(); extensionPoints.put(id, extensionPoint); return extensionPoint; @@ -71,7 +70,10 @@ public ExtensionPoint getOrCreateExtensionPoint(String id, Class type) public ExtensionPoint getOrCreateExtensionPoint(String id) { - ExtensionPoint extensionPoint = extensionPoints.getFromReadLock(id, ObjectDictionary::get); + ExtensionPoint extensionPoint = extensionPoints + .operations() + .getInReadLock(id, Dictionary::get); + if (extensionPoint != null) { return ClassUtils.unsafeNNCast(extensionPoint); } diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/Pool.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/Pool.java index 31cd6d85..1c4c9c57 100644 --- a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/Pool.java +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/Pool.java @@ -4,7 +4,7 @@ import java.util.function.Function; import java.util.function.LongFunction; import java.util.function.Supplier; -import javasabr.rlib.functions.ObjectLongFunction; +import javasabr.rlib.functions.ObjLongFunction; import org.jspecify.annotations.Nullable; /** @@ -35,7 +35,7 @@ default E take(long arg1, LongFunction factory) { default E take( F arg1, long arg2, - ObjectLongFunction factory) { + ObjLongFunction factory) { E take = take(); return take != null ? take : factory.apply(arg1, arg2); } diff --git a/settings.gradle b/settings.gradle index 493c2c5b..8bfc2fb8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -18,4 +18,5 @@ include ':rlib-io' include ':rlib-collections' include ':rlib-functions' include ':rlib-reusable' -include ':rlib-reference' \ No newline at end of file +include ':rlib-reference' +include ':rlib-concurrent' \ No newline at end of file From ead1b23e213031dda26169603aaf69d24627b31e Mon Sep 17 00:00:00 2001 From: javasabr Date: Wed, 10 Sep 2025 20:46:39 +0200 Subject: [PATCH 2/3] continue working on modules --- .../rlib/collections/array/ArrayFactory.java | 6 +- .../array/ArrayIterationFunctions.java | 1 - .../rlib/collections/array/LockableArray.java | 7 + .../array/LockableMutableArray.java | 15 - .../collections/array/impl/AbstractArray.java | 1 - ...eArray.java => AbstractLockableArray.java} | 9 +- .../array/impl/AbstractMutableArray.java | 2 - ...eArray.java => StampedLockBasedArray.java} | 6 +- .../rlib/collections/deque/DequeFactory.java | 15 + .../impl/AbstractLinkedListBasedDeque.java | 338 ++++++++++++++ .../impl/DefaultLinkedListBasedDeque.java | 142 ++++++ .../deque/impl/LinkedListIterator.java | 49 ++ .../collections/deque/impl/LinkedNode.java | 24 + .../collections/deque/impl/package-info.java | 4 + .../rlib/collections/deque/package-info.java | 4 + .../dictionary/DictionaryFactory.java | 10 +- .../LockableMutableRefDictionary.java | 9 - .../dictionary/LockableRefDictionary.java | 10 + ...stractLockableHashBasedRefDictionary.java} | 13 +- .../DefaultMutableHashBasedRefDictionary.java | 1 - ...ampedLockBasedHashBasedRefDictionary.java} | 7 +- .../concurrent/deadlock/DeadLockDetector.java | 128 ------ .../concurrent/deadlock/DeadLockListener.java | 20 - .../GroupThreadFactory.java | 22 +- .../{concurrent => }/util/ThreadUtils.java | 9 +- .../rlib/common/util/array/ArrayFactory.java | 20 - .../util/linkedlist/ConcurrentLinkedList.java | 49 -- .../common/util/linkedlist/LinkedList.java | 251 ----------- .../util/linkedlist/LinkedListFactory.java | 40 -- .../linkedlist/impl/AbstractLinkedList.java | 274 ----------- .../util/linkedlist/impl/FastLinkedList.java | 424 ------------------ .../util/linkedlist/impl/IteratorImpl.java | 140 ------ .../common/util/linkedlist/impl/Node.java | 91 ---- .../linkedlist/impl/SortedLinkedList.java | 42 -- .../SingleThreadPeriodicTaskExecutor.java | 4 +- .../impl/SingleThreadTaskExecutor.java | 3 +- .../executor/impl/ThreadPoolTaskExecutor.java | 13 +- .../lock/AsyncReadSyncWriteLock.java | 16 - .../rlib/concurrent/lock/LockFactory.java | 57 +-- .../rlib/concurrent/lock/LockUtils.java | 194 +------- .../rlib/concurrent/lock/Lockable.java | 8 - ...java => AtomicAsyncReadSyncWriteLock.java} | 37 +- .../rlib/concurrent/lock/impl/AtomicLock.java | 19 +- .../lock/impl/ReentrantARSWLock.java | 24 +- .../lock/impl/ReentrantAtomicLock.java | 32 +- .../concurrent/lock/impl/package-info.java | 4 + .../rlib/concurrent/lock/package-info.java | 4 + .../executor/TestThreadPoolTaskExecutor.java | 4 +- .../rlib/logger/impl/DefaultLoggerTest.java | 4 +- .../javasabr/rlib/network/Connection.java | 1 - .../rlib/network/ServerNetworkConfig.java | 2 +- .../client/impl/DefaultClientNetwork.java | 2 +- .../rlib/network/impl/AbstractConnection.java | 8 +- .../network/impl/ReuseBufferAllocator.java | 4 +- .../server/impl/DefaultServerNetwork.java | 2 +- .../exception/InitializePluginException.java | 1 - .../exception/PreloadPluginException.java | 1 - .../extension/ExtensionPointManager.java | 6 +- .../plugin/system/impl/BasePluginSystem.java | 3 - .../rlib/reference/ShortReference.java | 5 - .../pool/impl/LockableArrayBasePool.java | 4 +- 61 files changed, 705 insertions(+), 1940 deletions(-) create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/array/LockableArray.java delete mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/array/LockableMutableArray.java rename rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/{AbstractLockableMutableArray.java => AbstractLockableArray.java} (77%) rename rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/{StampedLockBasedMutableArray.java => StampedLockBasedArray.java} (80%) create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/deque/DequeFactory.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/AbstractLinkedListBasedDeque.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/DefaultLinkedListBasedDeque.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/LinkedListIterator.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/LinkedNode.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/package-info.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/deque/package-info.java delete mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableMutableRefDictionary.java create mode 100644 rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableRefDictionary.java rename rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/{AbstractLockableMutableHashBasedRefDictionary.java => AbstractLockableHashBasedRefDictionary.java} (84%) rename rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/{StampedLockBasedMutableHashBasedRefDictionary.java => StampedLockBasedHashBasedRefDictionary.java} (76%) delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockDetector.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockListener.java rename rlib-common/src/main/java/javasabr/rlib/common/{concurrent => util}/GroupThreadFactory.java (73%) rename rlib-common/src/main/java/javasabr/rlib/common/{concurrent => }/util/ThreadUtils.java (66%) delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/ConcurrentLinkedList.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedList.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedListFactory.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/AbstractLinkedList.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/FastLinkedList.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/IteratorImpl.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/Node.java delete mode 100644 rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/SortedLinkedList.java rename rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/{AtomicReadWriteLock.java => AtomicAsyncReadSyncWriteLock.java} (81%) create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/package-info.java create mode 100644 rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/package-info.java diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayFactory.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayFactory.java index a5200d8b..cf6ae064 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayFactory.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayFactory.java @@ -2,7 +2,7 @@ import javasabr.rlib.collections.array.impl.CopyOnWriteMutableArray; import javasabr.rlib.collections.array.impl.DefaultMutableArray; -import javasabr.rlib.collections.array.impl.StampedLockBasedMutableArray; +import javasabr.rlib.collections.array.impl.StampedLockBasedArray; import javasabr.rlib.common.util.ClassUtils; import lombok.experimental.UtilityClass; @@ -21,7 +21,7 @@ public static MutableArray copyOnModifyArray(Class type) { return new CopyOnWriteMutableArray<>(type); } - public static LockableMutableArray stampedLockBasedArray(Class type) { - return new StampedLockBasedMutableArray<>(type); + public static LockableArray stampedLockBasedArray(Class type) { + return new StampedLockBasedArray<>(type); } } diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayIterationFunctions.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayIterationFunctions.java index 857fbba0..37bfccce 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayIterationFunctions.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/array/ArrayIterationFunctions.java @@ -2,7 +2,6 @@ import java.util.function.BiConsumer; import java.util.function.BiPredicate; -import javasabr.rlib.functions.ObjLongObjConsumer; import javasabr.rlib.functions.ObjObjLongConsumer; import javasabr.rlib.functions.TriConsumer; import org.jspecify.annotations.Nullable; diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/LockableArray.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/LockableArray.java new file mode 100644 index 00000000..c1acb41b --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/array/LockableArray.java @@ -0,0 +1,7 @@ +package javasabr.rlib.collections.array; + +import javasabr.rlib.collections.operation.LockableSource; +import javasabr.rlib.common.util.ThreadSafe; + +public interface LockableArray extends MutableArray, LockableSource, ThreadSafe { +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/LockableMutableArray.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/LockableMutableArray.java deleted file mode 100644 index bd95cae6..00000000 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/array/LockableMutableArray.java +++ /dev/null @@ -1,15 +0,0 @@ -package javasabr.rlib.collections.array; - -import javasabr.rlib.common.util.ThreadSafe; - -public interface LockableMutableArray extends MutableArray, ThreadSafe { - - long readLock(); - void readUnlock(long stamp); - long tryOptimisticRead(); - - boolean validateLock(long stamp); - - long writeLock(); - void writeUnlock(long stamp); -} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractArray.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractArray.java index c0054265..ebe68081 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractArray.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractArray.java @@ -4,7 +4,6 @@ import java.util.Arrays; import java.util.Collection; -import java.util.Objects; import java.util.function.Consumer; import java.util.function.Function; import javasabr.rlib.collections.array.Array; diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractLockableMutableArray.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractLockableArray.java similarity index 77% rename from rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractLockableMutableArray.java rename to rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractLockableArray.java index 44dd73d0..bf19132a 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractLockableMutableArray.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractLockableArray.java @@ -1,7 +1,7 @@ package javasabr.rlib.collections.array.impl; import java.util.concurrent.atomic.AtomicInteger; -import javasabr.rlib.collections.array.LockableMutableArray; +import javasabr.rlib.collections.array.LockableArray; import javasabr.rlib.common.util.ArrayUtils; import lombok.AccessLevel; import lombok.Getter; @@ -12,8 +12,7 @@ @Accessors(fluent = true, chain = false) @FieldDefaults(level = AccessLevel.PROTECTED) -public abstract class AbstractLockableMutableArray extends AbstractMutableArray implements - LockableMutableArray { +public abstract class AbstractLockableArray extends AbstractMutableArray implements LockableArray { protected static final int DEFAULT_CAPACITY = 10; @@ -23,11 +22,11 @@ public abstract class AbstractLockableMutableArray extends AbstractMutableArr @Setter(AccessLevel.PROTECTED) volatile @Nullable E[] wrapped; - protected AbstractLockableMutableArray(Class type) { + protected AbstractLockableArray(Class type) { this(type, DEFAULT_CAPACITY); } - protected AbstractLockableMutableArray(Class type, int capacity) { + protected AbstractLockableArray(Class type, int capacity) { super(type); validateCapacity(capacity); this.wrapped = ArrayUtils.create(type, capacity); diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractMutableArray.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractMutableArray.java index da44d519..4975352c 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractMutableArray.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/AbstractMutableArray.java @@ -9,9 +9,7 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; import javasabr.rlib.collections.array.Array; -import javasabr.rlib.collections.array.UnsafeArray; import javasabr.rlib.collections.array.UnsafeMutableArray; -import javasabr.rlib.common.util.ArrayUtils; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import org.jspecify.annotations.Nullable; diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/StampedLockBasedMutableArray.java b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/StampedLockBasedArray.java similarity index 80% rename from rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/StampedLockBasedMutableArray.java rename to rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/StampedLockBasedArray.java index 8b2414f6..e0373c01 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/StampedLockBasedMutableArray.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/array/impl/StampedLockBasedArray.java @@ -5,15 +5,15 @@ import lombok.experimental.FieldDefaults; @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class StampedLockBasedMutableArray extends AbstractLockableMutableArray { +public class StampedLockBasedArray extends AbstractLockableArray { StampedLock stampedLock; - public StampedLockBasedMutableArray(Class type) { + public StampedLockBasedArray(Class type) { this(type, DEFAULT_CAPACITY); } - public StampedLockBasedMutableArray(Class type, int capacity) { + public StampedLockBasedArray(Class type, int capacity) { super(type, capacity); this.stampedLock = new StampedLock(); } diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/deque/DequeFactory.java b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/DequeFactory.java new file mode 100644 index 00000000..cee65390 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/DequeFactory.java @@ -0,0 +1,15 @@ +package javasabr.rlib.collections.deque; + +import java.util.Deque; +import javasabr.rlib.collections.deque.impl.DefaultLinkedListBasedDeque; +import lombok.experimental.UtilityClass; + +/** + * @author JavaSaBr + */ +@UtilityClass +public class DequeFactory { + public static Deque linkedListBased() { + return new DefaultLinkedListBasedDeque<>(); + } +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/AbstractLinkedListBasedDeque.java b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/AbstractLinkedListBasedDeque.java new file mode 100644 index 00000000..c93d5b90 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/AbstractLinkedListBasedDeque.java @@ -0,0 +1,338 @@ +package javasabr.rlib.collections.deque.impl; + +import java.util.Collection; +import java.util.Deque; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.Objects; +import javasabr.rlib.common.util.ArrayUtils; +import org.jspecify.annotations.Nullable; + +public abstract class AbstractLinkedListBasedDeque implements Deque { + + @Nullable + protected abstract LinkedNode firstNode(); + + @Nullable + protected abstract LinkedNode lastNode(); + + protected abstract E unlink(LinkedNode node); + + protected abstract E unlinkFirst(LinkedNode node); + + protected abstract E unlinkLast(LinkedNode node); + + protected abstract void linkFirst(E item); + protected abstract void linkLast(E item); + + @Override + public boolean addAll(Collection collection) { + + for (E object : collection) { + if (!add(object)) { + return false; + } + } + + return true; + } + + @Override + public boolean contains(@Nullable Object object) { + if (object == null) { + return false; + } + for (LinkedNode node = firstNode(); node != null; node = node.next) { + if (Objects.equals(node.item, object)) { + return true; + } + } + return false; + } + + @Override + public boolean containsAll(Collection collection) { + for (Object object : collection) { + if (!contains(object)) { + return false; + } + } + return true; + } + + @Override + public E element() { + return getFirst(); + } + + @Override + public E getFirst() { + + LinkedNode firstNode = firstNode(); + if (firstNode == null) { + throw new NoSuchElementException(); + } + + //noinspection DataFlowIssue + return firstNode.item; + } + + @Override + public E getLast() { + + LinkedNode linkedNode = lastNode(); + if (linkedNode == null) { + throw new NoSuchElementException(); + } + + //noinspection DataFlowIssue + return linkedNode.item; + } + + @Override + public boolean isEmpty() { + return size() < 1; + } + + @Override + public boolean offer(E element) { + return add(element); + } + + @Override + public boolean offerFirst(E element) { + addFirst(element); + return true; + } + + @Override + public boolean offerLast(E element) { + addLast(element); + return true; + } + + @Nullable + @Override + public E peek() { + LinkedNode first = firstNode(); + return first == null ? null : first.item; + } + + @Nullable + @Override + public E peekFirst() { + LinkedNode first = firstNode(); + return first == null ? null : first.item; + } + + @Nullable + @Override + public E peekLast() { + LinkedNode last = lastNode(); + return last == null ? null : last.item; + } + + @Override + public E pop() { + return removeFirst(); + } + + @Override + public void push(E element) { + linkFirst(element); + } + + @Override + public boolean add(E element) { + linkLast(element); + return true; + } + + @Override + public void addFirst(E element) { + linkFirst(element); + } + + @Override + public void addLast(E element) { + linkLast(element); + } + + @Nullable + @Override + public E poll() { + LinkedNode first = firstNode(); + return first == null ? null : unlinkFirst(first); + } + + @Nullable + @Override + public E pollFirst() { + LinkedNode first = firstNode(); + return first == null ? null : unlinkFirst(first); + } + + @Nullable + @Override + public E pollLast() { + LinkedNode last = lastNode(); + return last == null ? null : unlinkLast(last); + } + + @Override + public E remove() { + return removeFirst(); + } + + @Override + public E removeFirst() { + LinkedNode first = firstNode(); + if (first == null) { + throw new NoSuchElementException(); + } + return unlinkFirst(first); + } + + @Override + public E removeLast() { + + LinkedNode last = lastNode(); + if (last == null) { + throw new NoSuchElementException(); + } + + return unlinkLast(last); + } + + @Override + public boolean remove(@Nullable Object object) { + if (object == null) { + return false; + } + for (LinkedNode node = firstNode(); node != null; node = node.next) { + if (Objects.equals(object, node.item)) { + unlink(node); + return true; + } + } + return false; + } + + @Override + public boolean removeAll(Collection collection) { + for (Object object : collection) { + if (!remove(object)) { + return false; + } + } + return true; + } + + @Override + public boolean removeFirstOccurrence(@Nullable Object object) { + if (object == null) { + return false; + } + for (LinkedNode node = firstNode(); node != null; node = node.next) { + if (Objects.equals(object, node.item)) { + unlink(node); + return true; + } + } + return false; + } + + @Override + public boolean removeLastOccurrence(@Nullable Object object) { + if (object == null) { + return false; + } + for (LinkedNode node = lastNode(); node != null; node = node.prev) { + if (Objects.equals(object, node.item)) { + unlink(node); + return true; + } + } + return false; + } + + @Override + public boolean retainAll(Collection collection) { + for (LinkedNode node = firstNode(); node != null;) { + if (collection.contains(node.item)) { + node = node.next(); + continue; + } + var toUnlink = node; + node = node.next; + unlink(toUnlink); + } + return true; + } + + @Override + public Iterator iterator() { + return new LinkedListIterator<>(this, LinkedListIterator.NEXT); + } + + @Override + public Iterator descendingIterator() { + return new LinkedListIterator<>(this, LinkedListIterator.PREV); + } + + @Override + public Object[] toArray() { + + Object[] result = new Object[size()]; + int index = 0; + + for (LinkedNode node = firstNode(); node != null; node = node.next) { + //noinspection DataFlowIssue + result[index++] = node.item; + } + + return result; + } + + @Override + public T[] toArray(T[] container) { + + int size = size(); + + if (container.length < size) { + container = ArrayUtils.create(container, size); + } + + int index = 0; + + for (LinkedNode node = firstNode(); node != null; node = node.next) { + //noinspection DataFlowIssue,unchecked + container[index++] = (T) node.item; + } + + return container; + } + + @Override + public String toString() { + + StringBuilder builder = new StringBuilder("["); + + if (!isEmpty()) { + + for (E element : this) { + builder + .append(element) + .append(", "); + } + + if (builder.indexOf(",") != -1) { + builder.delete(builder.length() - 2, builder.length()); + } + } + + builder.append("]"); + + return builder.toString(); + } +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/DefaultLinkedListBasedDeque.java b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/DefaultLinkedListBasedDeque.java new file mode 100644 index 00000000..09f97710 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/DefaultLinkedListBasedDeque.java @@ -0,0 +1,142 @@ +package javasabr.rlib.collections.deque.impl; + +import java.util.Objects; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.experimental.Accessors; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; + +@Accessors(fluent = true, chain = false) +@FieldDefaults(level = AccessLevel.PROTECTED) +public class DefaultLinkedListBasedDeque extends AbstractLinkedListBasedDeque { + + @Nullable + @Getter(AccessLevel.PROTECTED) + LinkedNode firstNode; + + @Nullable + @Getter(AccessLevel.PROTECTED) + LinkedNode lastNode; + + @Getter + int size; + + @Nullable + @Override + protected E unlink(LinkedNode node) { + + E item = node.item; + LinkedNode next = node.next; + LinkedNode prev = node.prev; + + if (prev == null) { + firstNode = next; + } else { + prev.next = next; + node.prev = null; + } + + if (next == null) { + lastNode = prev; + } else { + next.prev = prev; + node.next = null; + } + + size--; + return item; + } + + @Nullable + @Override + protected E unlinkFirst(LinkedNode node) { + + E item = node.item; + LinkedNode next = node.next; + + firstNode = next; + if (next == null) { + lastNode = null; + } else { + next.prev = null; + } + + node.next = null; + node.item = null; + + size--; + return item; + } + + @Nullable + @Override + protected E unlinkLast(LinkedNode node) { + + E item = node.item; + LinkedNode prev = node.prev; + + lastNode = prev; + if (prev == null) { + firstNode = null; + } else { + prev.next = null; + } + + node.prev = null; + node.item = null; + + size--; + return item; + } + + @Override + protected void linkFirst(E item) { + Objects.requireNonNull(item); + + LinkedNode first = firstNode(); + LinkedNode linked = allocateNode(item, null, first); + + this.firstNode = linked; + + if (first == null) { + this.lastNode = linked; + } else { + first.prev = linked; + } + + size++; + } + + @Override + protected void linkLast(E item) { + Objects.requireNonNull(item); + + LinkedNode last = lastNode(); + LinkedNode linked = allocateNode(item, last, null); + + this.lastNode = linked; + + if (last == null) { + this.firstNode = linked; + } else { + last.next = linked; + } + + size++; + } + + protected LinkedNode allocateNode( + @Nullable E item, + @Nullable LinkedNode prev, + @Nullable LinkedNode next) { + return new LinkedNode<>(item, prev, next); + } + + @Override + public void clear() { + this.firstNode = null; + this.lastNode = null; + this.size = 0; + } +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/LinkedListIterator.java b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/LinkedListIterator.java new file mode 100644 index 00000000..e85731c8 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/LinkedListIterator.java @@ -0,0 +1,49 @@ +package javasabr.rlib.collections.deque.impl; + +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.function.Function; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; + +@FieldDefaults(level = AccessLevel.PROTECTED) +public class LinkedListIterator implements Iterator { + + public static final int NEXT = 1; + public static final int PREV = 2; + + final AbstractLinkedListBasedDeque linkedList; + final Function, @Nullable LinkedNode> nextFunction; + + @Nullable + LinkedNode next; + + public LinkedListIterator(AbstractLinkedListBasedDeque linkedList, int mode) { + if (mode == NEXT) { + nextFunction = LinkedNode::next; + next = linkedList.firstNode(); + } else if (mode == PREV) { + nextFunction = LinkedNode::prev; + next = linkedList.lastNode(); + } else { + throw new IllegalArgumentException("Unknown mode:" + mode); + } + this.linkedList = linkedList; + } + + @Override + public boolean hasNext() { + return next != null; + } + + @Override + public E next() { + if (next == null) { + throw new NoSuchElementException(); + } + E item = next.item; + next = nextFunction.apply(next); + return item; + } +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/LinkedNode.java b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/LinkedNode.java new file mode 100644 index 00000000..d563d7d9 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/LinkedNode.java @@ -0,0 +1,24 @@ +package javasabr.rlib.collections.deque.impl; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; + +@Getter +@Setter +@AllArgsConstructor +@Accessors(fluent = true, chain = false) +@FieldDefaults(level = AccessLevel.PROTECTED) +public class LinkedNode { + + @Nullable + E item; + @Nullable + LinkedNode prev; + @Nullable + LinkedNode next; +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/package-info.java b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/package-info.java new file mode 100644 index 00000000..1b08bb89 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/impl/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.collections.deque.impl; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/deque/package-info.java b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/package-info.java new file mode 100644 index 00000000..bffcfef6 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/deque/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.collections.deque; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/DictionaryFactory.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/DictionaryFactory.java index 4cb1b418..580eb746 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/DictionaryFactory.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/DictionaryFactory.java @@ -1,7 +1,7 @@ package javasabr.rlib.collections.dictionary; import javasabr.rlib.collections.dictionary.impl.DefaultMutableHashBasedRefDictionary; -import javasabr.rlib.collections.dictionary.impl.StampedLockBasedMutableHashBasedRefDictionary; +import javasabr.rlib.collections.dictionary.impl.StampedLockBasedHashBasedRefDictionary; import lombok.experimental.UtilityClass; @UtilityClass @@ -16,13 +16,13 @@ public static MutableRefDictionary mutableRefDictionary( return new DefaultMutableHashBasedRefDictionary<>(); } - public static LockableMutableRefDictionary lockableRefDictionary() { - return new StampedLockBasedMutableHashBasedRefDictionary<>(); + public static LockableRefDictionary stampedLockBasedRefDictionary() { + return new StampedLockBasedHashBasedRefDictionary<>(); } - public static LockableMutableRefDictionary lockableRefDictionary( + public static LockableRefDictionary stampedLockBasedRefDictionary( Class keyType, Class valueType) { - return new StampedLockBasedMutableHashBasedRefDictionary<>(); + return new StampedLockBasedHashBasedRefDictionary<>(); } } diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableMutableRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableMutableRefDictionary.java deleted file mode 100644 index f7c5a2b8..00000000 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableMutableRefDictionary.java +++ /dev/null @@ -1,9 +0,0 @@ -package javasabr.rlib.collections.dictionary; - -import javasabr.rlib.collections.operation.LockableOperations; -import javasabr.rlib.collections.operation.LockableSource; - -public interface LockableMutableRefDictionary extends MutableRefDictionary, LockableSource { - - LockableOperations> operations(); -} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableRefDictionary.java new file mode 100644 index 00000000..b6a175b4 --- /dev/null +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/LockableRefDictionary.java @@ -0,0 +1,10 @@ +package javasabr.rlib.collections.dictionary; + +import javasabr.rlib.collections.operation.LockableOperations; +import javasabr.rlib.collections.operation.LockableSource; +import javasabr.rlib.common.util.ThreadSafe; + +public interface LockableRefDictionary extends MutableRefDictionary, LockableSource, ThreadSafe { + + LockableOperations> operations(); +} diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableMutableHashBasedRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableHashBasedRefDictionary.java similarity index 84% rename from rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableMutableHashBasedRefDictionary.java rename to rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableHashBasedRefDictionary.java index 2fa154cf..121f27e3 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableMutableHashBasedRefDictionary.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/AbstractLockableHashBasedRefDictionary.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import javasabr.rlib.collections.dictionary.LockableMutableRefDictionary; +import javasabr.rlib.collections.dictionary.LockableRefDictionary; import javasabr.rlib.collections.dictionary.RefDictionary; import javasabr.rlib.collections.operation.LockableOperations; import javasabr.rlib.collections.operation.impl.DefaultLockableOperations; @@ -12,20 +12,19 @@ import org.jspecify.annotations.Nullable; @FieldDefaults(level = AccessLevel.PROTECTED) -public abstract class AbstractLockableMutableHashBasedRefDictionary extends - AbstractMutableHashBasedRefDictionary> implements - LockableMutableRefDictionary { +public abstract class AbstractLockableHashBasedRefDictionary extends + AbstractMutableHashBasedRefDictionary> implements LockableRefDictionary { final AtomicReference<@Nullable DefaultLinkedHashEntry[]> entries; final AtomicInteger size; int threshold; - public AbstractLockableMutableHashBasedRefDictionary() { + public AbstractLockableHashBasedRefDictionary() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); } - public AbstractLockableMutableHashBasedRefDictionary(int initCapacity, float loadFactor) { + public AbstractLockableHashBasedRefDictionary(int initCapacity, float loadFactor) { super(loadFactor); //noinspection unchecked,rawtypes this.entries = new AtomicReference<>(new DefaultLinkedHashEntry[initCapacity]); @@ -97,7 +96,7 @@ public RefDictionary toReadOnly() { } @Override - public LockableOperations> operations() { + public LockableOperations> operations() { return new DefaultLockableOperations<>(this); } } diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableHashBasedRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableHashBasedRefDictionary.java index c2450e26..974c9357 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableHashBasedRefDictionary.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/DefaultMutableHashBasedRefDictionary.java @@ -2,7 +2,6 @@ import java.util.Arrays; import javasabr.rlib.collections.dictionary.RefDictionary; -import javasabr.rlib.common.util.ArrayUtils; import lombok.AccessLevel; import lombok.Getter; import lombok.experimental.Accessors; diff --git a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedMutableHashBasedRefDictionary.java b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedHashBasedRefDictionary.java similarity index 76% rename from rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedMutableHashBasedRefDictionary.java rename to rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedHashBasedRefDictionary.java index e14d5c76..b4eb0485 100644 --- a/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedMutableHashBasedRefDictionary.java +++ b/rlib-collections/src/main/java/javasabr/rlib/collections/dictionary/impl/StampedLockBasedHashBasedRefDictionary.java @@ -5,16 +5,15 @@ import lombok.experimental.FieldDefaults; @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class StampedLockBasedMutableHashBasedRefDictionary extends - AbstractLockableMutableHashBasedRefDictionary { +public class StampedLockBasedHashBasedRefDictionary extends AbstractLockableHashBasedRefDictionary { StampedLock stampedLock; - public StampedLockBasedMutableHashBasedRefDictionary() { + public StampedLockBasedHashBasedRefDictionary() { this.stampedLock = new StampedLock(); } - public StampedLockBasedMutableHashBasedRefDictionary(int initCapacity, float loadFactor) { + public StampedLockBasedHashBasedRefDictionary(int initCapacity, float loadFactor) { super(initCapacity, loadFactor); this.stampedLock = new StampedLock(); } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockDetector.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockDetector.java deleted file mode 100644 index c5729eb8..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockDetector.java +++ /dev/null @@ -1,128 +0,0 @@ -package javasabr.rlib.common.concurrent.deadlock; - -import java.lang.management.ManagementFactory; -import java.lang.management.ThreadMXBean; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import javasabr.rlib.common.util.array.Array; -import javasabr.rlib.common.util.array.ArrayFactory; -import javasabr.rlib.common.util.array.ConcurrentArray; -import javasabr.rlib.logger.api.Logger; -import javasabr.rlib.logger.api.LoggerManager; -import lombok.Getter; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The implementation of a deadlock detector. - * - * @author JavaSaBr - */ -@NullMarked -public class DeadLockDetector implements Runnable { - - private static final Logger LOGGER = LoggerManager.getLogger(DeadLockDetector.class); - - /** - * The list of listeners. - */ - @Getter - private final ConcurrentArray listeners; - - /** - * The bean with information about threads. - */ - private final ThreadMXBean mxThread; - - /** - * The scheduler. - */ - private final ScheduledExecutorService executorService; - - /** - * The reference to a task. - */ - @Getter - private volatile @Nullable ScheduledFuture schedule; - - /** - * The checking interval. - */ - private final int interval; - - public DeadLockDetector(int interval) { - - if (interval < 1) { - throw new IllegalArgumentException("negative interval."); - } - - this.listeners = null; - // this.listeners = ArrayFactory.newConcurrentReentrantRWLockArray(DeadLockListener.class); - this.mxThread = ManagementFactory.getThreadMXBean(); - this.executorService = Executors.newSingleThreadScheduledExecutor(); - this.interval = interval; - } - - /** - * Add a new listener. - * - * @param listener the new listener. - */ - public void addListener(DeadLockListener listener) { - listeners.runInWriteLock(listener, Array::add); - } - - @Override - public void run() { - - var threadIds = mxThread.findDeadlockedThreads(); - - if (threadIds.length < 1) { - return; - } - - var listeners = getListeners(); - - for (var id : threadIds) { - - var info = mxThread.getThreadInfo(id); - - if (listeners.isEmpty()) { - continue; - } - - listeners.runInReadLock(info, (list, inf) -> list.forEachR(inf, DeadLockListener::onDetected)); - - LOGGER.warning("DeadLock detected! : " + info); - } - } - - /** - * Start. - */ - public synchronized void start() { - - if (schedule != null) { - return; - } - - schedule = executorService.scheduleAtFixedRate(this, interval, interval, TimeUnit.MILLISECONDS); - } - - /** - * Stop. - */ - public synchronized void stop() { - - var schedule = getSchedule(); - if (schedule == null) { - return; - } - - schedule.cancel(false); - - this.schedule = null; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockListener.java b/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockListener.java deleted file mode 100644 index e3910eed..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/deadlock/DeadLockListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package javasabr.rlib.common.concurrent.deadlock; - -import java.lang.management.ThreadInfo; -import org.jspecify.annotations.NullMarked; - -/** - * The interface to implement a deadlock listener. - * - * @author JavaSaBr - */ -@NullMarked -public interface DeadLockListener { - - /** - * Notify about deadlock detecting. - * - * @param info the information about thread. - */ - void onDetected(ThreadInfo info); -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/GroupThreadFactory.java b/rlib-common/src/main/java/javasabr/rlib/common/util/GroupThreadFactory.java similarity index 73% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/GroupThreadFactory.java rename to rlib-common/src/main/java/javasabr/rlib/common/util/GroupThreadFactory.java index caf1ee3c..e41f0beb 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/GroupThreadFactory.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/GroupThreadFactory.java @@ -1,30 +1,28 @@ -package javasabr.rlib.common.concurrent; +package javasabr.rlib.common.util; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; -import org.jspecify.annotations.NullMarked; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; /** - * The implementation of the {@link ThreadFactory} to create threads in the same thread group. - * * @author JavaSaBr */ -@NullMarked +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public class GroupThreadFactory implements ThreadFactory { - @NullMarked public interface ThreadConstructor { Thread create(ThreadGroup group, Runnable runnable, String name); } - private final AtomicInteger ordinal; - private final String name; - private final ThreadGroup group; - private final ThreadConstructor constructor; + AtomicInteger ordinal; + String name; + ThreadGroup group; + ThreadConstructor constructor; - private final int priority; - private final boolean daemon; + int priority; + boolean daemon; public GroupThreadFactory(String name) { this(name, Thread::new, Thread.NORM_PRIORITY); diff --git a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ThreadUtils.java b/rlib-common/src/main/java/javasabr/rlib/common/util/ThreadUtils.java similarity index 66% rename from rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ThreadUtils.java rename to rlib-common/src/main/java/javasabr/rlib/common/util/ThreadUtils.java index 76081022..e6d9269f 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/concurrent/util/ThreadUtils.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/ThreadUtils.java @@ -1,22 +1,15 @@ -package javasabr.rlib.common.concurrent.util; +package javasabr.rlib.common.util; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; /** - * The class with utilities methods to work with threads. - * * @author JavaSaBr */ public class ThreadUtils { private static final Logger LOGGER = LoggerManager.getLogger(ThreadUtils.class); - /** - * Sleep the current thread. - * - * @param time the time in ms. - */ public static void sleep(long time) { try { Thread.sleep(time); diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/array/ArrayFactory.java b/rlib-common/src/main/java/javasabr/rlib/common/util/array/ArrayFactory.java index 1df46957..f878d04f 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/array/ArrayFactory.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/array/ArrayFactory.java @@ -54,10 +54,6 @@ public static ReadOnlyArray newReadOnlyArray(E[] elements) { return new ReadOnlyFastArray<>(elements); } - public static Array newArraySet(Class type) { - return new FastArraySet<>(type); - } - public static ConcurrentArray newConcurrentStampedLockArray(Class type) { return new ConcurrentStampedLockArray<>(type); } @@ -74,18 +70,6 @@ public static ConcurrentArray newConcurrentStampedLockArray(E [] array) { return result; } - public static ConcurrentArray newConcurrentStampedLockArraySet(Class type) { - return new ConcurrentStampedLockArraySet<>(type); - } - - public static > Array newSortedArray(Class type) { - return new SortedFastArray<>(unsafeNNCast(type)); - } - - public static Array newSynchronizedArray(Class type) { - return new SynchronizedArray<>(type); - } - public static MutableIntegerArray newMutableIntegerArray() { return new DefaultIntegerArray(); } @@ -98,10 +82,6 @@ public static MutableIntegerArray newMutableIntegerArray(int... numbers) { return new DefaultIntegerArray(numbers); } - public static LongArray newLongArray() { - return new FastLongArray(); - } - public static LongArray newLongArray(int capacity) { return new FastLongArray(capacity); } diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/ConcurrentLinkedList.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/ConcurrentLinkedList.java deleted file mode 100644 index 1980e601..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/ConcurrentLinkedList.java +++ /dev/null @@ -1,49 +0,0 @@ -package javasabr.rlib.common.util.linkedlist; - -import org.jspecify.annotations.NullMarked; - -/** - * The interface to implement concurrent supporting. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public interface ConcurrentLinkedList extends LinkedList { - - /** - * Lock this array for writing. - * - * @return the stamp of write lock or 0. - */ - default long writeLock() { - throw new UnsupportedOperationException(); - } - - /** - * Unlock the write lock. - * - * @param stamp the stamp of write lock. - */ - default void writeUnlock(final long stamp) { - throw new UnsupportedOperationException(); - } - - /** - * Lock this array for reading. - * - * @return the stamp of read lock or 0. - */ - default long readLock() { - throw new UnsupportedOperationException(); - } - - /** - * Unlock the read lock. - * - * @param stamp the stamp of read lock. - */ - default void readUnlock(final long stamp) { - throw new UnsupportedOperationException(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedList.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedList.java deleted file mode 100644 index d6c746e7..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedList.java +++ /dev/null @@ -1,251 +0,0 @@ -package javasabr.rlib.common.util.linkedlist; - -import java.io.Serializable; -import java.util.Deque; -import java.util.Objects; -import java.util.function.BiConsumer; -import java.util.function.BiPredicate; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import javasabr.rlib.common.function.LongBiObjectConsumer; -import javasabr.rlib.common.function.TripleConsumer; -import javasabr.rlib.common.function.TriplePredicate; -import javasabr.rlib.common.util.linkedlist.impl.Node; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * Интерфей с для реализации связанного списка. Главное преймущество, это переиспользование узлов списка и быстрая - * итерация с уменьшением нагрузки на GC. Создаются с помощью {@link LinkedListFactory}. - *
- * for(Node<E> node = getFirstNode(); node != null; node = node.getNext()) {
- * 	? item = node.getItem();
- * 	// handle item
- * }
- * 
- * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public interface LinkedList extends Deque, Cloneable, Serializable { - - @Override - default void forEach(Consumer consumer) { - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - consumer.accept(node.getItem()); - } - } - - /** - * Apply a function to each filtered element. - * - * @param condition the condition. - * @param function the function. - */ - default void forEach(Predicate condition, Consumer function) { - for (var node = getFirstNode(); node != null; node = node.getNext()) { - var item = node.getItem(); - if (condition.test(item)) { - function.accept(item); - } - } - } - - /** - * Apply the function to each element which is an instance of the passed type. - * - * @param type the interested element's type. - * @param function the function. - * @param the element's type. - */ - default void applyIfType(Class type, Consumer function) { - for (var node = getFirstNode(); node != null; node = node.getNext()) { - var item = node.getItem(); - if (type.isInstance(item)) { - function.accept(type.cast(item)); - } - } - } - - /** - * Apply a function to each element. - * - * @param the type of an argument. - * @param argument the argument. - * @param function the function. - */ - default void forEach(@Nullable T argument, BiConsumer function) { - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - function.accept(argument, node.getItem()); - } - } - - /** - * Apply a function to each filtered element. - * - * @param the type of an argument. - * @param argument the argument. - * @param condition the condition. - * @param function the function. - */ - default void forEach( - @Nullable T argument, - BiPredicate condition, - BiConsumer<@Nullable T, E> function) { - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - final E item = node.getItem(); - if (condition.test(item, argument)) { - function.accept(argument, item); - } - } - } - - /** - * Apply a function to each filtered element. - * - * @param the type of a first argument. - * @param the type of a second argument. - * @param first the first argument. - * @param second the second argument. - * @param condition the condition. - * @param function the function. - */ - default void forEach( - @Nullable F first, - @Nullable S second, - TriplePredicate condition, - TripleConsumer function) { - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - final E item = node.getItem(); - if (condition.test(item, first, second)) { - function.accept(first, second, item); - } - } - } - - /** - * Apply a function to each element. - * - * @param the type of a first argument. - * @param the type of a second argument. - * @param first the first argument. - * @param second the second argument. - * @param function the function. - */ - default void forEach( - @Nullable final F first, - @Nullable final S second, - TripleConsumer function) { - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - function.accept(first, second, node.getItem()); - } - } - - /** - * Apply a function to each element. - * - * @param the type of a second argument. - * @param first the first argument. - * @param second the second argument. - * @param function the function. - */ - default void forEach(long first, final F second, LongBiObjectConsumer function) { - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - function.accept(first, second, node.getItem()); - } - } - - /** - * Apply a function to each element to replace an original element. - * - * @param function the function. - */ - default void apply(Function function) { - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - node.setItem(function.apply(node.getItem())); - } - } - - /** - * Gets an element for an index. - * - * @param index the index of an element. - * @return the element for the index. - */ - E get(int index); - - /** - * Get a first node. - * - * @return the first node. - */ - @Nullable Node getFirstNode(); - - /** - * Get a last node. - * - * @return the last node. - */ - @Nullable Node getLastNode(); - - /** - * Finds an index of an object in this list. - * - * @param object the object to find. - * @return the index of the object or -1. - */ - int indexOf(Object object); - - /** - * Returns the (non-null) Node at the specified element index. - * - * @param index the index of a node. - * @return the node. - */ - default Node node(int index) { - - final int size = size(); - - if (index < (size >> 1)) { - Node node = getFirstNode(); - for (int i = 0; i < index && node != null; i++) { - node = node.getNext(); - } - return Objects.requireNonNull(node); - } else { - Node node = getLastNode(); - for (int i = size() - 1; i > index && node != null; i--) { - node = node.getPrev(); - } - return Objects.requireNonNull(node); - } - } - - /** - * Removes an element for an index without reordering. - * - * @param index the index of the element. - * @return the removed element. - */ - @Nullable - default E remove(int index) { - return unlink(node(index)); - } - - /** - * Take and remove a first element. - * - * @return the first element or null. - */ - @Nullable E take(); - - /** - * Remove a node from this list. - * - * @param node the node. - * @return the removed element. - */ - @Nullable E unlink(Node node); -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedListFactory.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedListFactory.java deleted file mode 100644 index 573fecf9..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/LinkedListFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -package javasabr.rlib.common.util.linkedlist; - -import javasabr.rlib.common.util.linkedlist.impl.FastLinkedList; -import javasabr.rlib.common.util.linkedlist.impl.SortedLinkedList; -import org.jspecify.annotations.NullMarked; - -/** - * The factory of linked list implementations. - * - * @author JavaSaBr - */ -@NullMarked -public final class LinkedListFactory { - - /** - * New linked list linked list. - * - * @param the type parameter - * @param type the type - * @return the linked list - */ - public static LinkedList newLinkedList(Class type) { - return new FastLinkedList<>(type); - } - - /** - * New sorted linked list linked list. - * - * @param the type parameter - * @param type the type - * @return the linked list - */ - public static > LinkedList newSortedLinkedList(Class type) { - return new SortedLinkedList<>(type); - } - - private LinkedListFactory() { - throw new RuntimeException(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/AbstractLinkedList.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/AbstractLinkedList.java deleted file mode 100644 index b6a59938..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/AbstractLinkedList.java +++ /dev/null @@ -1,274 +0,0 @@ -package javasabr.rlib.common.util.linkedlist.impl; - -import java.util.Collection; -import java.util.NoSuchElementException; -import java.util.Objects; -import javasabr.rlib.common.util.ClassUtils; -import javasabr.rlib.common.util.linkedlist.LinkedList; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The base implementation of the LinkedList. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public abstract class AbstractLinkedList implements LinkedList { - - private static final long serialVersionUID = 8034712584065781997L; - - /** - * The element type. - */ - protected final Class type; - - /** - * Instantiates a new Abstract linked list. - * - * @param type the type - */ - public AbstractLinkedList(Class type) { - this.type = ClassUtils.unsafeCast(type); - } - - @Override - public boolean addAll(Collection collection) { - - for (E object : collection) { - if (!add(object)) { - return false; - } - } - - return true; - } - - @Override - public boolean contains(@Nullable Object object) { - return indexOf(object) != -1; - } - - @Override - public boolean containsAll(Collection collection) { - - for (Object object : collection) { - if (!contains(object)) { - return false; - } - } - - return true; - } - - @Override - public E element() { - return getFirst(); - } - - @Override - public E getFirst() { - - Node first = getFirstNode(); - if (first == null) { - throw new NoSuchElementException(); - } - - return first.getItem(); - } - - @Override - public E getLast() { - - final Node last = getLastNode(); - - if (last == null) { - throw new NoSuchElementException(); - } - - return last.getItem(); - } - - /** - * Get an element type. - * - * @return the element type. - */ - protected Class getType() { - return type; - } - - @Override - public int indexOf(final Object object) { - - int index = 0; - - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - final E item = node.getItem(); - if (Objects.equals(item, object)) { - return index; - } - index++; - } - - return -1; - } - - @Override - public boolean isEmpty() { - return size() < 1; - } - - @Override - public boolean offer(E element) { - return add(element); - } - - @Override - public boolean offerFirst(E element) { - addFirst(element); - return true; - } - - @Override - public boolean offerLast(E element) { - addLast(element); - return true; - } - - @Override - public @Nullable E peek() { - Node first = getFirstNode(); - return first == null ? null : first.getItem(); - } - - @Override - public @Nullable E peekFirst() { - final Node first = getFirstNode(); - return first == null ? null : first.getItem(); - } - - @Override - public @Nullable E peekLast() { - final Node last = getLastNode(); - return last == null ? null : last.getItem(); - } - - @Override - public E pop() { - return removeFirst(); - } - - @Override - public void push(final E element) { - addFirst(element); - } - - @Override - public E remove() { - return removeFirst(); - } - - @Override - public boolean remove(@Nullable Object object) { - - if (object == null) { - throw new NullPointerException("object is null."); - } - - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - if (object.equals(node.getItem())) { - unlink(node); - return true; - } - } - - return false; - } - - @Override - public boolean removeAll(final Collection collection) { - - for (final Object object : collection) { - if (!remove(object)) { - return false; - } - } - - return true; - } - - @Override - public boolean removeFirstOccurrence(@Nullable Object object) { - - if (object == null) { - throw new NullPointerException("not fond object."); - } - - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - if (object.equals(node.getItem())) { - unlink(node); - return true; - } - } - - return false; - } - - @Override - public boolean removeLastOccurrence(@Nullable Object object) { - - if (object == null) { - throw new NullPointerException("not fond object."); - } - - for (Node node = getLastNode(); node != null; node = node.getPrev()) { - if (object.equals(node.getItem())) { - unlink(node); - return true; - } - } - - return false; - } - - @Override - public boolean retainAll(Collection collection) { - - for (E object : this) { - if (!collection.contains(object) && !remove(object)) { - return false; - } - } - - return true; - } - - @Override - public String toString() { - - StringBuilder builder = new StringBuilder(getClass().getSimpleName()); - builder - .append(" size = ") - .append(size()) - .append(" : ["); - - if (!isEmpty()) { - - for (E element : this) { - builder - .append(element) - .append(", "); - } - - if (builder.indexOf(",") != -1) { - builder.delete(builder.length() - 2, builder.length()); - } - } - - builder.append("]"); - - return builder.toString(); - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/FastLinkedList.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/FastLinkedList.java deleted file mode 100644 index 2b78239e..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/FastLinkedList.java +++ /dev/null @@ -1,424 +0,0 @@ -package javasabr.rlib.common.util.linkedlist.impl; - -import java.util.Iterator; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.function.Function; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The non thread-safe implementation of the LinkedList. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class FastLinkedList extends AbstractLinkedList { - - private static final long serialVersionUID = 6627882787737291879L; - - /** - * The first element. - */ - @Nullable - private Node first; - - /** - * The second element. - */ - @Nullable - private Node last; - - /** - * The size. - */ - private int size; - - /** - * Instantiates a new Fast linked list. - * - * @param type the type - */ - public FastLinkedList(Class type) { - super(type); - } - - @Override - public boolean add(E element) { - linkLast(element); - return true; - } - - @Override - public void addFirst(E element) { - linkFirst(element); - } - - @Override - public void addLast(E element) { - linkLast(element); - } - - @Override - public void apply(Function function) { - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - node.setItem(function.apply(node.getItem())); - } - } - - @Override - public void clear() { - setFirstNode(null); - setLastNode(null); - size = 0; - } - - @Override - public Iterator descendingIterator() { - return new IteratorImpl<>(this, IteratorImpl.PREV); - } - - @Override - public E get(int index) { - return index < size() >> 1 ? getFirst(index) : getLast(index); - } - - /** - * Gets first. - * - * @param index the index - * @return the first - */ - protected final E getFirst(int index) { - - int i = 0; - - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - if (i == index) { - return node.getItem(); - } - i++; - } - - throw new NoSuchElementException(); - } - - @Nullable - @Override - public final Node getFirstNode() { - return first; - } - - /** - * Sets first node. - * - * @param first the first node. - */ - protected void setFirstNode(@Nullable final Node first) { - this.first = first; - } - - /** - * Gets last. - * - * @param index the index - * @return the last - */ - protected final E getLast(final int index) { - - int i = size() - 1; - - for (Node node = getLastNode(); node != null; node = node.getPrev()) { - if (i == index) { - return node.getItem(); - } - i--; - } - - throw new NoSuchElementException(); - } - - @Nullable - @Override - public final Node getLastNode() { - return last; - } - - /** - * Sets last node. - * - * @param last the last node. - */ - protected void setLastNode(@Nullable final Node last) { - this.last = last; - } - - /** - * Get a new node. - * - * @param prev the prev node. - * @param item the item. - * @param next the next node. - * @return the new node. - */ - protected Node getNewNode(@Nullable Node prev, E item, @Nullable Node next) { - - Node node = new Node<>(); - node.setItem(item); - node.setNext(next); - node.setPrev(prev); - - return node; - } - - /** - * Insert after. - * - * @param node the node - * @param item the item - */ - protected final void insertAfter(Node node, E item) { - - Node next = node.getNext(); - Node newNode = getNewNode(node, item, next); - - if (next == null) { - setLastNode(newNode); - } else { - next.setPrev(newNode); - } - - node.setNext(newNode); - } - - /** - * Insert before. - * - * @param node the node - * @param item the item - */ - protected final void insertBefore(Node node, E item) { - - Node prev = node.getPrev(); - Node newNode = getNewNode(prev, item, node); - - if (prev == null) { - setFirstNode(newNode); - } else { - prev.setNext(newNode); - } - - node.setPrev(newNode); - } - - @Override - public Iterator iterator() { - return new IteratorImpl<>(this, IteratorImpl.NEXT); - } - - /** - * Link first. - * - * @param item the item - */ - protected final void linkFirst(E item) { - Objects.requireNonNull(item); - - Node first = getFirstNode(); - Node newNode = getNewNode(null, item, first); - - setFirstNode(newNode); - - if (first == null) { - setLastNode(newNode); - } else { - first.setPrev(newNode); - } - - size++; - } - - /** - * Link last. - * - * @param item the item - */ - protected final void linkLast(E item) { - Objects.requireNonNull(item); - - Node last = getLastNode(); - Node newNode = getNewNode(last, item, null); - - setLastNode(newNode); - - if (last == null) { - setFirstNode(newNode); - } else { - last.setNext(newNode); - } - - size++; - } - - @Override - public @Nullable E poll() { - Node first = getFirstNode(); - return first == null ? null : unlinkFirst(first); - } - - @Override - public @Nullable E pollFirst() { - Node first = getFirstNode(); - return first == null ? null : unlinkFirst(first); - } - - @Override - public @Nullable E pollLast() { - Node last = getLastNode(); - return last == null ? null : unlinkLast(last); - } - - @Override - public E removeFirst() { - - Node first = getFirstNode(); - if (first == null) { - throw new NoSuchElementException(); - } - - return unlinkFirst(first); - } - - @Override - public E removeLast() { - - Node last = getLastNode(); - if (last == null) { - throw new NoSuchElementException(); - } - - return unlinkLast(last); - } - - @Override - public int size() { - return size; - } - - @Override - public E take() { - return removeFirst(); - } - - @Override - public Object[] toArray() { - - Object[] array = (Object[]) java.lang.reflect.Array.newInstance(getType(), size()); - - int index = 0; - - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - array[index++] = node.getItem(); - } - - return array; - } - - @Override - @SuppressWarnings("unchecked") - public T[] toArray(T[] array) { - - int size = size(); - - if (array.length < size) { - array = (T[]) java.lang.reflect.Array.newInstance( - array - .getClass() - .getComponentType(), size); - } - - int i = 0; - - Object[] result = array; - - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - result[i++] = node.getItem(); - } - - return array; - } - - @Override - public final E unlink(Node node) { - - E element = node.getItem(); - - Node next = node.getNext(); - Node prev = node.getPrev(); - - if (prev == null) { - setFirstNode(next); - } else { - prev.setNext(next); - } - - if (next == null) { - setLastNode(prev); - } else { - next.setPrev(prev); - } - - size--; - - return element; - } - - /** - * Unlink first e. - * - * @param node the node - * @return the e - */ - protected final E unlinkFirst(Node node) { - - E element = node.getItem(); - Node next = node.getNext(); - - setFirstNode(next); - - if (next == null) { - setLastNode(null); - } else { - next.setPrev(null); - } - - size--; - - return element; - } - - /** - * Unlink last e. - * - * @param node the node - * @return the e - */ - protected final E unlinkLast(Node node) { - - E element = node.getItem(); - Node prev = node.getPrev(); - - setLastNode(prev); - - if (prev == null) { - setFirstNode(null); - } else { - prev.setNext(null); - } - - size--; - - return element; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/IteratorImpl.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/IteratorImpl.java deleted file mode 100644 index 7ba28889..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/IteratorImpl.java +++ /dev/null @@ -1,140 +0,0 @@ -package javasabr.rlib.common.util.linkedlist.impl; - -import java.util.Iterator; -import java.util.NoSuchElementException; -import java.util.Objects; -import javasabr.rlib.common.util.linkedlist.LinkedList; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The implementation of an iterator for the LinkedList. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class IteratorImpl implements Iterator { - - /** - * The iteration mode from start to end. - */ - public static final int NEXT = 1; - - /** - * The iteration mode from end to start. - */ - public static final int PREV = 2; - - /** - * The linked list. - */ - private final LinkedList list; - - /** - * The last returned node. - */ - @Nullable - private Node lastReturned; - - /** - * The next node. - */ - private Node next; - - /** - * The iteration mode. - */ - private final int mode; - - /** - * The next index. - */ - private int nextIndex; - - /** - * Instantiates a new Iterator. - * - * @param list the list - * @param mode the mode - */ - protected IteratorImpl(LinkedList list, int mode) { - this.nextIndex = 0; - this.mode = mode; - this.list = list; - setNext(mode == NEXT ? list.getFirstNode() : mode == PREV ? list.getLastNode() : null); - } - - @Nullable - private Node getLastReturned() { - return lastReturned; - } - - private void setLastReturned(@Nullable Node lastReturned) { - this.lastReturned = lastReturned; - } - - private Node getNext() { - return Objects.requireNonNull(next); - } - - private void setNext(@Nullable Node next) { - this.next = next; - } - - @Override - public boolean hasNext() { - return mode == NEXT ? nextIndex < list.size() : mode == PREV && nextIndex > 0; - } - - @Override - public E next() { - - if (!hasNext()) { - throw new NoSuchElementException(); - } - - if (mode == NEXT) { - - Node next = getNext(); - - setNext(next.getNext()); - setLastReturned(next); - - nextIndex++; - - return next.getItem(); - } else if (mode == PREV) { - - Node next = getNext(); - - setNext(next.getPrev()); - setLastReturned(next); - - nextIndex--; - - return next.getItem(); - } - - throw new NoSuchElementException(); - } - - @Override - public void remove() { - - Node lastReturned = getLastReturned(); - if (lastReturned == null) { - throw new IllegalStateException(); - } - - list.unlink(lastReturned); - - if (mode == NEXT) { - nextIndex--; - } else if (mode == PREV) { - nextIndex++; - } - - setLastReturned(null); - } -} \ No newline at end of file diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/Node.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/Node.java deleted file mode 100644 index 81067a8d..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/Node.java +++ /dev/null @@ -1,91 +0,0 @@ -package javasabr.rlib.common.util.linkedlist.impl; - -import javasabr.rlib.common.util.Reusable; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; - -/** - * The node of the LinkedList. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public final class Node implements Reusable { - - /** - * The item. - */ - private @Nullable E item; - - /** - * The prev node. - */ - private @Nullable Node prev; - - /** - * The next node. - */ - private @Nullable Node next; - - @Override - public void cleanup() { - item = null; - prev = null; - next = null; - } - - /** - * Gets item. - * - * @return yhe item. - */ - public @Nullable E getItem() { - return item; - } - - /** - * Sets item. - * - * @param item yhe item. - */ - public void setItem(@Nullable E item) { - this.item = item; - } - - /** - * Gets next. - * - * @return yhe next node. - */ - public @Nullable Node getNext() { - return next; - } - - /** - * Sets next. - * - * @param next yhe next node. - */ - public void setNext(@Nullable Node next) { - this.next = next; - } - - /** - * Gets prev. - * - * @return yhe prev node. - */ - public @Nullable Node getPrev() { - return prev; - } - - /** - * Sets prev. - * - * @param prev yhe prev node. - */ - public void setPrev(@Nullable Node prev) { - this.prev = prev; - } -} diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/SortedLinkedList.java b/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/SortedLinkedList.java deleted file mode 100644 index f4bb0a07..00000000 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/linkedlist/impl/SortedLinkedList.java +++ /dev/null @@ -1,42 +0,0 @@ -package javasabr.rlib.common.util.linkedlist.impl; - -import java.io.Serial; -import org.jspecify.annotations.NonNull; -import org.jspecify.annotations.NullMarked; - -/** - * The implementation of {@link FastLinkedList} with to sort on put an element. - * - * @param the type parameter - * @author JavaSaBr - */ -@NullMarked -public class SortedLinkedList> extends FastLinkedList { - - @Serial - private static final long serialVersionUID = -8115760928469233254L; - - /** - * Instantiates a new Sorted linked list. - * - * @param type the type - */ - public SortedLinkedList(Class type) { - super(type); - } - - @Override - public boolean add(@NonNull E element) { - - for (Node node = getFirstNode(); node != null; node = node.getNext()) { - E item = node.getItem(); - if (item != null && element.compareTo(item) < 0) { - insertBefore(node, element); - return true; - } - } - - linkLast(element); - return true; - } -} diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java index 9e20b265..6882f508 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadPeriodicTaskExecutor.java @@ -14,7 +14,7 @@ import javasabr.rlib.concurrent.lock.Lockable; import javasabr.rlib.concurrent.task.PeriodicTask; import javasabr.rlib.concurrent.util.ConcurrentUtils; -import javasabr.rlib.common.concurrent.util.ThreadUtils; +import javasabr.rlib.common.util.ThreadUtils; import javasabr.rlib.functions.LongObjConsumer; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; @@ -56,7 +56,7 @@ public SingleThreadPeriodicTaskExecutor( this.executeTasks = ArrayFactory.mutableArray(taskClass); this.finishedTasks = ArrayFactory.mutableArray(taskClass); this.wait = new AtomicBoolean(); - this.lock = LockFactory.newAtomicLock(); + this.lock = LockFactory.atomicLock(); this.interval = interval; this.thread = threadFactory.apply(this, name); this.thread.setPriority(priority); diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadTaskExecutor.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadTaskExecutor.java index b8baaa70..03c313d2 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadTaskExecutor.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/SingleThreadTaskExecutor.java @@ -18,7 +18,6 @@ import javasabr.rlib.logger.api.LoggerManager; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; -import org.jspecify.annotations.Nullable; /** * @author JavaSaBr @@ -42,7 +41,7 @@ public SingleThreadTaskExecutor( L local) { this.waitTasks = ArrayFactory.mutableArray(CallableTask.class); this.wait = new AtomicBoolean(); - this.lock = LockFactory.newAtomicLock(); + this.lock = LockFactory.atomicLock(); this.thread = threadFactory.apply(this, name); this.thread.setPriority(priority); this.thread.setDaemon(true); diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/ThreadPoolTaskExecutor.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/ThreadPoolTaskExecutor.java index 8e20bcd0..311c3913 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/ThreadPoolTaskExecutor.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/executor/impl/ThreadPoolTaskExecutor.java @@ -1,25 +1,24 @@ package javasabr.rlib.concurrent.executor.impl; +import java.util.Deque; import java.util.concurrent.CompletionStage; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; import java.util.function.Function; import javasabr.rlib.collections.array.ArrayFactory; import javasabr.rlib.collections.array.MutableArray; -import javasabr.rlib.common.concurrent.GroupThreadFactory; +import javasabr.rlib.collections.deque.DequeFactory; +import javasabr.rlib.common.util.GroupThreadFactory; import javasabr.rlib.concurrent.executor.TaskExecutor; import javasabr.rlib.concurrent.lock.LockFactory; import javasabr.rlib.concurrent.lock.Lockable; import javasabr.rlib.concurrent.task.CallableTask; import javasabr.rlib.concurrent.task.SimpleTask; import javasabr.rlib.concurrent.util.ConcurrentUtils; -import javasabr.rlib.common.util.linkedlist.LinkedList; -import javasabr.rlib.common.util.linkedlist.LinkedListFactory; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; -import org.jspecify.annotations.Nullable; /** * @author JavaSaBr @@ -29,7 +28,7 @@ public class ThreadPoolTaskExecutor implements TaskExecutor, Runnable, Loc protected static final Logger LOGGER = LoggerManager.getLogger(ThreadPoolTaskExecutor.class); - LinkedList> waitTasks; + Deque> waitTasks; MutableArray threads; Function localObjectsFactory; @@ -43,9 +42,9 @@ public ThreadPoolTaskExecutor( int poolSize, int packetSize) { this.localObjectsFactory = localObjectsFactory; - this.waitTasks = LinkedListFactory.newLinkedList(CallableTask.class); + this.waitTasks = DequeFactory.linkedListBased(); this.wait = new AtomicBoolean(); - this.lock = LockFactory.newAtomicLock(); + this.lock = LockFactory.atomicLock(); this.threads = ArrayFactory.mutableArray(Thread.class); this.packetSize = packetSize; diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/AsyncReadSyncWriteLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/AsyncReadSyncWriteLock.java index 31291862..32298b09 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/AsyncReadSyncWriteLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/AsyncReadSyncWriteLock.java @@ -1,29 +1,13 @@ package javasabr.rlib.concurrent.lock; /** - * The interface for implementing async reading and sync writing lock. - * * @author JavaSaBr */ public interface AsyncReadSyncWriteLock { - /** - * Lock any writing for reading. - */ void asyncLock(); - - /** - * Finish this reading and unlock any writing if it is last reading. - */ void asyncUnlock(); - /** - * Lock any reading for writing. - */ void syncLock(); - - /** - * Finish this writing and unlock any readings. - */ void syncUnlock(); } diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockFactory.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockFactory.java index 464c8afb..30c83ec0 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockFactory.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockFactory.java @@ -6,79 +6,40 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.StampedLock; import javasabr.rlib.concurrent.lock.impl.AtomicLock; -import javasabr.rlib.concurrent.lock.impl.AtomicReadWriteLock; +import javasabr.rlib.concurrent.lock.impl.AtomicAsyncReadSyncWriteLock; import javasabr.rlib.concurrent.lock.impl.ReentrantARSWLock; import javasabr.rlib.concurrent.lock.impl.ReentrantAtomicLock; -import org.jspecify.annotations.NullMarked; /** - * The factory for creating new locks. - * * @author JavaSaBr */ -@NullMarked public class LockFactory { - /** - * Create a new {@link ReentrantARSWLock}. - * - * @return the new lock. - */ - public static AsyncReadSyncWriteLock newReentrantARSWLock() { + public static AsyncReadSyncWriteLock reentrantARSWLock() { return new ReentrantARSWLock(); } - /** - * Create a new {@link FinalStampedLock}. - * - * @return the new lock. - */ - public static StampedLock newStampedLock() { + public static StampedLock stampedLock() { return new StampedLock(); } - /** - * Create a new {@link FinalReentrantLock}. - * - * @return the new lock. - */ - public static Lock newReentrantLock() { + public static Lock reentrantLock() { return new ReentrantLock(); } - /** - * Create a new {@link FinalAtomicReadWriteLock}. - * - * @return the new lock. - */ - public static AsyncReadSyncWriteLock newAtomicARSWLock() { - return new AtomicReadWriteLock(); + public static AsyncReadSyncWriteLock atomicARSWLock() { + return new AtomicAsyncReadSyncWriteLock(); } - /** - * Create a new {@link FinalAtomicLock}. - * - * @return the new lock. - */ - public static Lock newAtomicLock() { + public static Lock atomicLock() { return new AtomicLock(); } - /** - * Create a new {@link FinalReentrantReadWriteLock}. - * - * @return the new lock. - */ - public static ReadWriteLock newReentrantRWLock() { + public static ReadWriteLock reentrantRWLock() { return new ReentrantReadWriteLock(); } - /** - * Create a new {@link FinalReentrantAtomicLock}. - * - * @return the new lock. - */ - public static Lock newReentrantAtomicLock() { + public static Lock reentrantAtomicLock() { return new ReentrantAtomicLock(); } } diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockUtils.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockUtils.java index f780cbb0..b925e9f2 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockUtils.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/LockUtils.java @@ -1,194 +1,24 @@ package javasabr.rlib.concurrent.lock; import java.util.concurrent.locks.Lock; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; -import javasabr.rlib.common.function.FunctionInt; -import javasabr.rlib.common.function.ObjectIntFunction; -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; +import lombok.experimental.UtilityClass; /** - * The class with utility methods to work with locks. - * * @author JavaSaBr */ -@NullMarked +@UtilityClass public class LockUtils { - /** - * Execute a function in locked block. - * - * @param the type parameter - * @param lockable the lockable object. - * @param consumer the function. - */ - public static void runInLock(@Nullable L lockable, Consumer consumer) { - if (lockable == null) { - return; - } - lockable.lock(); - try { - consumer.accept(lockable); - } finally { - lockable.unlock(); - } - } - - /** - * Execute a function in locked block. - * - * @param the type parameter - * @param the type parameter - * @param lockable the lockable object. - * @param argument the additional argument. - * @param consumer the function. - */ - public static void runInLock( - @Nullable L lockable, - @Nullable F argument, - BiConsumer<@Nullable L, @Nullable F> consumer) { - if (lockable == null) { - return; - } - lockable.lock(); - try { - consumer.accept(lockable, argument); - } finally { - lockable.unlock(); - } - } - - /** - * Execute a function in locked block. - * - * @param the type parameter - * @param the type parameter - * @param lockable the lockable object. - * @param function the function. - * @return результат работы функции либо null. - */ - @Nullable - public static R getInLock( - @Nullable L lockable, - Function<@Nullable L, @Nullable R> function) { - if (lockable == null) { - return null; - } - lockable.lock(); - try { - return function.apply(lockable); - } finally { - lockable.unlock(); - } - } - - /** - * Execute a function in locked block. - * - * @param the type parameter - * @param lockable the lockable object. - * @param function the function. - * @return результат работы функции либо -1. - */ - public static int getInLockInt( - @Nullable L lockable, - FunctionInt<@Nullable L> function) { - if (lockable == null) { - return -1; - } - lockable.lock(); - try { - return function.apply(lockable); - } finally { - lockable.unlock(); - } - } - - /** - * Execute a function in locked block. - * - * @param the type parameter - * @param the type parameter - * @param the type parameter - * @param lockable the lockable object. - * @param argument the additional argument. - * @param function the function. - * @return результат работы функции либо null. - */ - @Nullable - public static R getInLock( - @Nullable L lockable, - @Nullable F argument, - BiFunction<@Nullable L, @Nullable F, R> function) { - if (lockable == null) { - return null; - } - lockable.lock(); - try { - return function.apply(lockable, argument); - } finally { - lockable.unlock(); - } - } - - /** - * Execute a function in locked block. - * - * @param the type parameter - * @param the type parameter - * @param lockable the lockable object. - * @param argument the additional argument. - * @param function the function. - * @return результат работы функции либо null. - */ - @Nullable - public static R getInLock( - @Nullable final L lockable, - int argument, - ObjectIntFunction<@Nullable L, R> function) { - if (lockable == null) { - return null; - } - lockable.lock(); - try { - return function.apply(lockable, argument); - } finally { - lockable.unlock(); - } - } - - /** - * Lock two locks. - * - * @param first the first lock. - * @param second the second lock. - */ public static void lock(Lockable first, Lock second) { first.lock(); second.lock(); } - /** - * Lock two lockable objects. - * - * @param first the first lockable object. - * @param second the second lockable object. - */ public static void lock(Lockable first, Lockable second) { first.lock(); second.lock(); } - /** - * Lock two comparable and lockable objects. - * - * @param the type parameter - * @param first the first lockable object. - * @param second the second lockable object. - */ public static & Lockable> void lock(T first, T second) { int result = first.compareTo(second); if (result == 0 || result < 0) { @@ -200,35 +30,17 @@ public static & Lockable> void lock(T first, T second) } } - /** - * Unlock two locks. - * - * @param first the first lock. - * @param second the second lock. - */ public static void unlock(Lock first, Lock second) { first.unlock(); second.unlock(); } - /** - * Unlock two lockable objects. - * - * @param first the first lockable object. - * @param second the second lockable object. - */ + public static void unlock(Lockable first, Lockable second) { first.unlock(); second.unlock(); } - /** - * Unlock two comparable and lockable objects. - * - * @param the type parameter - * @param first the first lockable object. - * @param second the second lockable object. - */ public static & Lockable> void unlock(T first, T second) { int result = first.compareTo(second); if (result == 0 || result < 0) { diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/Lockable.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/Lockable.java index 6825923f..e2d1d645 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/Lockable.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/Lockable.java @@ -1,19 +1,11 @@ package javasabr.rlib.concurrent.lock; /** - * The interface to mark a object that it has a lock/unlock methods. - * * @author JavaSaBr */ public interface Lockable { - /** - * Lock this object. - */ void lock(); - /** - * Unlock this object. - */ void unlock(); } diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicReadWriteLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicAsyncReadSyncWriteLock.java similarity index 81% rename from rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicReadWriteLock.java rename to rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicAsyncReadSyncWriteLock.java index a4f6a517..029d0d74 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicReadWriteLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicAsyncReadSyncWriteLock.java @@ -5,16 +5,14 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import javasabr.rlib.concurrent.lock.AsyncReadSyncWriteLock; -import org.jspecify.annotations.NullMarked; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; /** - * The implementation of the {@link AsyncReadSyncWriteLock} using the several {@link ReusableAtomicInteger} without supporting - * reentrant calls. - * * @author JavaSaBr */ -@NullMarked -public class AtomicReadWriteLock implements AsyncReadSyncWriteLock, Lock { +@FieldDefaults(level = AccessLevel.PROTECTED) +public class AtomicAsyncReadSyncWriteLock implements AsyncReadSyncWriteLock, Lock { private static final int STATUS_WRITE_LOCKED = 1; private static final int STATUS_WRITE_UNLOCKED = 0; @@ -22,30 +20,13 @@ public class AtomicReadWriteLock implements AsyncReadSyncWriteLock, Lock { private static final int STATUS_READ_UNLOCKED = 0; private static final int STATUS_READ_LOCKED = -200000; - /** - * The status of write lock. - */ - protected final AtomicInteger writeStatus; - - /** - * The count of writers. - */ - protected final AtomicInteger writeCount; - - /** - * The count of readers. - */ - protected final AtomicInteger readCount; + final AtomicInteger writeStatus; + final AtomicInteger writeCount; + final AtomicInteger readCount; - /** - * The field for consuming CPU. - */ - protected int sink; + int sink; - /** - * Instantiates a new Atomic read write lock. - */ - public AtomicReadWriteLock() { + public AtomicAsyncReadSyncWriteLock() { this.writeCount = new AtomicInteger(0); this.writeStatus = new AtomicInteger(0); this.readCount = new AtomicInteger(0); diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicLock.java index 9611bd60..4e465794 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/AtomicLock.java @@ -4,32 +4,23 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; import org.jspecify.annotations.NullMarked; /** - * The implementation of the {@link Lock} based on using {@link ReusableAtomicInteger} without supporting reentrant calls. - * * @author JavaSaBr */ -@NullMarked +@FieldDefaults(level = AccessLevel.PROTECTED) public class AtomicLock implements Lock { private static final int STATUS_LOCKED = 1; private static final int STATUS_UNLOCKED = 0; - /** - * The status of lock. - */ - protected final AtomicInteger status; + final AtomicInteger status; - /** - * The field for consuming CPU. - */ - protected int sink; + int sink; - /** - * Instantiates a new Atomic lock. - */ public AtomicLock() { this.status = new AtomicInteger(); this.sink = 1; diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantARSWLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantARSWLock.java index 02048bb5..03c87fea 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantARSWLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantARSWLock.java @@ -2,34 +2,22 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; import javasabr.rlib.concurrent.lock.AsyncReadSyncWriteLock; import javasabr.rlib.concurrent.lock.LockFactory; -import org.jspecify.annotations.NullMarked; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; /** - * The wrapper of {@link ReentrantReadWriteLock} for implementing the interface {@link AsyncReadSyncWriteLock}*. - * * @author JavaSaBr */ -@NullMarked +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public final class ReentrantARSWLock implements AsyncReadSyncWriteLock { - /** - * The locker of writing. - */ - private final Lock readLock; + Lock readLock; + Lock writeLock; - /** - * The locker of reading. - */ - private final Lock writeLock; - - /** - * Instantiates a new Reentrant arsw lock. - */ public ReentrantARSWLock() { - ReadWriteLock readWriteLock = LockFactory.newReentrantRWLock(); + ReadWriteLock readWriteLock = LockFactory.reentrantRWLock(); readLock = readWriteLock.readLock(); writeLock = readWriteLock.writeLock(); } diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantAtomicLock.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantAtomicLock.java index 537a5cde..451bac08 100644 --- a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantAtomicLock.java +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/ReentrantAtomicLock.java @@ -5,34 +5,21 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; -import org.jspecify.annotations.NullMarked; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import org.jspecify.annotations.Nullable; /** - * The implementation of the {@link Lock} based on using {@link ReusableAtomicInteger} with supporting reentrant calls. - * * @author JavaSaBr */ -@NullMarked +@FieldDefaults(level = AccessLevel.PROTECTED) public class ReentrantAtomicLock implements Lock { - /** - * The status of lock. - */ - private final AtomicReference status; + final AtomicReference<@Nullable Thread> status; + final AtomicInteger level; - /** - * The level of locking. - */ - private final AtomicInteger level; + int sink; - /** - * The field for consuming CPU. - */ - private int sink; - - /** - * Instantiates a new Reentrant atomic lock. - */ public ReentrantAtomicLock() { this.status = new AtomicReference<>(); this.level = new AtomicInteger(); @@ -46,8 +33,9 @@ public void lock() { if (status.get() == thread) { return; } - while (!status.compareAndSet(null, thread)) + while (!status.compareAndSet(null, thread)) { consumeCPU(); + } } finally { level.incrementAndGet(); } @@ -105,7 +93,7 @@ public boolean tryLock(long time, TimeUnit unit) { @Override public void unlock() { - final Thread thread = Thread.currentThread(); + Thread thread = Thread.currentThread(); if (status.get() != thread) { return; } diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/package-info.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/package-info.java new file mode 100644 index 00000000..729848a8 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/impl/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.concurrent.lock.impl; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/package-info.java b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/package-info.java new file mode 100644 index 00000000..e00f8bf1 --- /dev/null +++ b/rlib-concurrent/src/main/java/javasabr/rlib/concurrent/lock/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package javasabr.rlib.concurrent.lock; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/rlib-concurrent/src/test/java/javasabr/rlib/concurrent/executor/TestThreadPoolTaskExecutor.java b/rlib-concurrent/src/test/java/javasabr/rlib/concurrent/executor/TestThreadPoolTaskExecutor.java index 271b80fc..9a21954b 100644 --- a/rlib-concurrent/src/test/java/javasabr/rlib/concurrent/executor/TestThreadPoolTaskExecutor.java +++ b/rlib-concurrent/src/test/java/javasabr/rlib/concurrent/executor/TestThreadPoolTaskExecutor.java @@ -1,8 +1,8 @@ package javasabr.rlib.concurrent.executor; import java.util.concurrent.atomic.AtomicInteger; -import javasabr.rlib.common.concurrent.GroupThreadFactory; -import javasabr.rlib.common.concurrent.util.ThreadUtils; +import javasabr.rlib.common.util.GroupThreadFactory; +import javasabr.rlib.common.util.ThreadUtils; import javasabr.rlib.concurrent.executor.impl.ThreadPoolTaskExecutor; import org.junit.jupiter.api.Assertions; diff --git a/rlib-logger-impl/src/test/java/javasabr/rlib/logger/impl/DefaultLoggerTest.java b/rlib-logger-impl/src/test/java/javasabr/rlib/logger/impl/DefaultLoggerTest.java index 214f00c5..ca1a0807 100644 --- a/rlib-logger-impl/src/test/java/javasabr/rlib/logger/impl/DefaultLoggerTest.java +++ b/rlib-logger-impl/src/test/java/javasabr/rlib/logger/impl/DefaultLoggerTest.java @@ -1,7 +1,7 @@ package javasabr.rlib.logger.impl; import javasabr.rlib.collections.array.ArrayFactory; -import javasabr.rlib.collections.array.LockableMutableArray; +import javasabr.rlib.collections.array.LockableArray; import javasabr.rlib.logger.api.LoggerLevel; import javasabr.rlib.logger.api.LoggerListener; import javasabr.rlib.logger.api.LoggerManager; @@ -13,7 +13,7 @@ public class DefaultLoggerTest { - private static final LockableMutableArray WROTE_DATA = ArrayFactory + private static final LockableArray WROTE_DATA = ArrayFactory .stampedLockBasedArray(String.class); private static final LoggerListener LOGGER_LISTENER = text -> { diff --git a/rlib-network/src/main/java/javasabr/rlib/network/Connection.java b/rlib-network/src/main/java/javasabr/rlib/network/Connection.java index b62581b5..62410328 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/Connection.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/Connection.java @@ -2,7 +2,6 @@ import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; -import javasabr.rlib.common.function.NotNullBiConsumer; import javasabr.rlib.network.packet.ReadablePacket; import javasabr.rlib.network.packet.WritablePacket; import lombok.AllArgsConstructor; diff --git a/rlib-network/src/main/java/javasabr/rlib/network/ServerNetworkConfig.java b/rlib-network/src/main/java/javasabr/rlib/network/ServerNetworkConfig.java index 2d9cf73f..9288365f 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/ServerNetworkConfig.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/ServerNetworkConfig.java @@ -1,7 +1,7 @@ package javasabr.rlib.network; import java.nio.ByteOrder; -import javasabr.rlib.common.concurrent.GroupThreadFactory; +import javasabr.rlib.common.util.GroupThreadFactory; import lombok.Builder; import lombok.Getter; diff --git a/rlib-network/src/main/java/javasabr/rlib/network/client/impl/DefaultClientNetwork.java b/rlib-network/src/main/java/javasabr/rlib/network/client/impl/DefaultClientNetwork.java index 73bd98ec..f4e5fb48 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/client/impl/DefaultClientNetwork.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/client/impl/DefaultClientNetwork.java @@ -10,7 +10,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiFunction; -import javasabr.rlib.common.concurrent.util.ThreadUtils; +import javasabr.rlib.common.util.ThreadUtils; import javasabr.rlib.common.util.AsyncUtils; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; diff --git a/rlib-network/src/main/java/javasabr/rlib/network/impl/AbstractConnection.java b/rlib-network/src/main/java/javasabr/rlib/network/impl/AbstractConnection.java index 9eb338d0..6928ea7a 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/impl/AbstractConnection.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/impl/AbstractConnection.java @@ -4,14 +4,14 @@ import java.nio.channels.AsynchronousChannel; import java.nio.channels.AsynchronousSocketChannel; +import java.util.Deque; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.StampedLock; import java.util.function.BiConsumer; import javasabr.rlib.collections.array.ArrayFactory; import javasabr.rlib.collections.array.MutableArray; -import javasabr.rlib.common.util.linkedlist.LinkedList; -import javasabr.rlib.common.util.linkedlist.LinkedListFactory; +import javasabr.rlib.collections.deque.DequeFactory; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; import javasabr.rlib.network.BufferAllocator; @@ -53,7 +53,7 @@ public WritablePacketWithFeedback(CompletableFuture attachment, W packe protected final Network> network; protected final BufferAllocator bufferAllocator; protected final AsynchronousSocketChannel channel; - protected final LinkedList pendingPackets; + protected final Deque pendingPackets; protected final StampedLock lock; protected final AtomicBoolean isWriting; @@ -74,7 +74,7 @@ public AbstractConnection( this.maxPacketsByRead = maxPacketsByRead; this.lock = new StampedLock(); this.channel = channel; - this.pendingPackets = LinkedListFactory.newLinkedList(WritablePacket.class); + this.pendingPackets = DequeFactory.linkedListBased(); this.network = network; this.isWriting = new AtomicBoolean(false); this.closed = new AtomicBoolean(false); diff --git a/rlib-network/src/main/java/javasabr/rlib/network/impl/ReuseBufferAllocator.java b/rlib-network/src/main/java/javasabr/rlib/network/impl/ReuseBufferAllocator.java index a4f9200c..8b578ba3 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/impl/ReuseBufferAllocator.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/impl/ReuseBufferAllocator.java @@ -3,7 +3,7 @@ import java.nio.ByteBuffer; import java.util.function.Function; import javasabr.rlib.collections.array.ArrayFactory; -import javasabr.rlib.collections.array.LockableMutableArray; +import javasabr.rlib.collections.array.LockableArray; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; import javasabr.rlib.network.BufferAllocator; @@ -23,7 +23,7 @@ public class ReuseBufferAllocator implements BufferAllocator { protected final Pool readBufferPool; protected final Pool pendingBufferPool; protected final Pool writeBufferPool; - protected final LockableMutableArray byteBuffers; + protected final LockableArray byteBuffers; protected final NetworkConfig config; diff --git a/rlib-network/src/main/java/javasabr/rlib/network/server/impl/DefaultServerNetwork.java b/rlib-network/src/main/java/javasabr/rlib/network/server/impl/DefaultServerNetwork.java index 56dfb6e1..0d140639 100644 --- a/rlib-network/src/main/java/javasabr/rlib/network/server/impl/DefaultServerNetwork.java +++ b/rlib-network/src/main/java/javasabr/rlib/network/server/impl/DefaultServerNetwork.java @@ -19,7 +19,7 @@ import java.util.function.Consumer; import javasabr.rlib.collections.array.ArrayFactory; import javasabr.rlib.collections.array.MutableArray; -import javasabr.rlib.common.concurrent.GroupThreadFactory; +import javasabr.rlib.common.util.GroupThreadFactory; import javasabr.rlib.common.util.ClassUtils; import javasabr.rlib.common.util.Utils; import javasabr.rlib.logger.api.Logger; diff --git a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/exception/InitializePluginException.java b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/exception/InitializePluginException.java index fb64846e..507825ec 100644 --- a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/exception/InitializePluginException.java +++ b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/exception/InitializePluginException.java @@ -3,7 +3,6 @@ import java.nio.file.Path; import lombok.Getter; import lombok.experimental.Accessors; -import org.jspecify.annotations.NullMarked; /** * @author JavaSaBr diff --git a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/exception/PreloadPluginException.java b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/exception/PreloadPluginException.java index ba1ad586..1cc7d1a0 100644 --- a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/exception/PreloadPluginException.java +++ b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/exception/PreloadPluginException.java @@ -3,7 +3,6 @@ import java.nio.file.Path; import lombok.Getter; import lombok.experimental.Accessors; -import org.jspecify.annotations.NullMarked; /** * @author JavaSaBr diff --git a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/extension/ExtensionPointManager.java b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/extension/ExtensionPointManager.java index a6f32ae5..e9b6711c 100644 --- a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/extension/ExtensionPointManager.java +++ b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/extension/ExtensionPointManager.java @@ -2,7 +2,7 @@ import javasabr.rlib.collections.dictionary.Dictionary; import javasabr.rlib.collections.dictionary.DictionaryFactory; -import javasabr.rlib.collections.dictionary.LockableMutableRefDictionary; +import javasabr.rlib.collections.dictionary.LockableRefDictionary; import javasabr.rlib.common.util.ClassUtils; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; @@ -27,10 +27,10 @@ public static ExtensionPoint register(String id) { return getInstance().create(id); } - LockableMutableRefDictionary> extensionPoints; + LockableRefDictionary> extensionPoints; public ExtensionPointManager() { - this.extensionPoints = DictionaryFactory.lockableRefDictionary(); + this.extensionPoints = DictionaryFactory.stampedLockBasedRefDictionary(); } public ExtensionPoint create(String id) { diff --git a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/impl/BasePluginSystem.java b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/impl/BasePluginSystem.java index 95fca370..dc12c9ac 100644 --- a/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/impl/BasePluginSystem.java +++ b/rlib-plugin-system/src/main/java/javasabr/rlib/plugin/system/impl/BasePluginSystem.java @@ -3,7 +3,6 @@ import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE; import static java.util.concurrent.CompletableFuture.supplyAsync; import static javasabr.rlib.common.util.ObjectUtils.notNull; -import static javasabr.rlib.common.util.dictionary.DictionaryCollectors.toObjectDictionary; import java.io.IOException; import java.io.UncheckedIOException; @@ -26,12 +25,10 @@ import javasabr.rlib.collections.array.Array; import javasabr.rlib.collections.array.ArrayCollectors; import javasabr.rlib.collections.dictionary.DictionaryCollectors; -import javasabr.rlib.collections.dictionary.DictionaryFactory; import javasabr.rlib.collections.dictionary.MutableRefDictionary; import javasabr.rlib.collections.dictionary.RefDictionary; import javasabr.rlib.common.util.ClassUtils; import javasabr.rlib.common.util.Utils; -import javasabr.rlib.common.util.dictionary.ObjectDictionary; import javasabr.rlib.io.util.FileUtils; import javasabr.rlib.logger.api.Logger; import javasabr.rlib.logger.api.LoggerManager; diff --git a/rlib-reference/src/main/java/javasabr/rlib/reference/ShortReference.java b/rlib-reference/src/main/java/javasabr/rlib/reference/ShortReference.java index 6d62522a..97034c2a 100644 --- a/rlib-reference/src/main/java/javasabr/rlib/reference/ShortReference.java +++ b/rlib-reference/src/main/java/javasabr/rlib/reference/ShortReference.java @@ -2,11 +2,6 @@ import lombok.AllArgsConstructor; import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; import lombok.experimental.Accessors; /** diff --git a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/LockableArrayBasePool.java b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/LockableArrayBasePool.java index 13591d48..2251bcb9 100644 --- a/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/LockableArrayBasePool.java +++ b/rlib-reusable/src/main/java/javasabr/rlib/reusable/pool/impl/LockableArrayBasePool.java @@ -1,7 +1,7 @@ package javasabr.rlib.reusable.pool.impl; import javasabr.rlib.collections.array.ArrayFactory; -import javasabr.rlib.collections.array.LockableMutableArray; +import javasabr.rlib.collections.array.LockableArray; import javasabr.rlib.reusable.pool.Pool; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; @@ -10,7 +10,7 @@ @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public class LockableArrayBasePool implements Pool { - LockableMutableArray pool; + LockableArray pool; public LockableArrayBasePool(Class type) { this.pool = ArrayFactory.stampedLockBasedArray(type); From 73909a5eea2e1892f51b0a58ef500504e6f81250 Mon Sep 17 00:00:00 2001 From: javasabr Date: Wed, 10 Sep 2025 20:51:13 +0200 Subject: [PATCH 3/3] fix compilation --- .../util/dictionary/ConcurrentStampedLockObjectDictionary.java | 1 - 1 file changed, 1 deletion(-) diff --git a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentStampedLockObjectDictionary.java b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentStampedLockObjectDictionary.java index 59c9e51f..4bef9755 100644 --- a/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentStampedLockObjectDictionary.java +++ b/rlib-common/src/main/java/javasabr/rlib/common/util/dictionary/ConcurrentStampedLockObjectDictionary.java @@ -1,7 +1,6 @@ package javasabr.rlib.common.util.dictionary; import java.util.concurrent.locks.StampedLock; -import javasabr.rlib.common.concurrent.lock.LockFactory; import org.jspecify.annotations.NullMarked; /**