Skip to content

Commit bc857ac

Browse files
committed
implement concurrent object dictionary based on stamped lock
1 parent ac6a6b6 commit bc857ac

20 files changed

Lines changed: 455 additions & 343 deletions

rlib-common/src/main/java/com/ss/rlib/common/util/Utils.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,23 @@ public static void unchecked(@NotNull SafeRunnable function) {
120120
}
121121
}
122122

123+
/**
124+
* Try to execute a function with some result.
125+
*
126+
* @param <R> the result's type.
127+
* @param function the function.
128+
* @return the result or null.
129+
* @since 9.5.0
130+
*/
131+
public static <R> @Nullable R tryGet(@NotNull SafeSupplier<@NotNull R> function) {
132+
try {
133+
return function.get();
134+
} catch (Exception e) {
135+
// can be ignored
136+
return null;
137+
}
138+
}
139+
123140
/**
124141
* Execute the function with auto-converting a checked exception to an unchecked.
125142
*
Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.ss.rlib.common.util.dictionary;
22

3+
import com.ss.rlib.common.concurrent.atomic.AtomicInteger;
4+
import com.ss.rlib.common.util.ArrayUtils;
35
import org.jetbrains.annotations.NotNull;
46

57
/**
@@ -8,24 +10,14 @@
810
* @param <V> the type parameter
911
* @author JavaSaBr
1012
*/
11-
public abstract class AbstractConcurrentIntegerDictionary<V> extends AbstractIntegerDictionary<V>
12-
implements ConcurrentIntegerDictionary<V> {
13-
14-
/**
15-
* Тhe array of entries.
16-
*/
17-
@NotNull
18-
private volatile IntegerEntry<V>[] entries;
19-
20-
/**
21-
* The next size value at which to resize (capacity * load factor).
22-
*/
23-
private volatile int threshold;
13+
public abstract class AbstractConcurrentIntegerDictionary<V> extends AbstractIntegerDictionary<V> implements
14+
ConcurrentIntegerDictionary<V> {
15+
16+
private final @NotNull AtomicInteger size;
17+
18+
private volatile @NotNull IntegerEntry<V>[] entries;
2419

25-
/**
26-
* The count of values in this {@link Dictionary}.
27-
*/
28-
private volatile int size;
20+
private volatile int threshold;
2921

3022
protected AbstractConcurrentIntegerDictionary() {
3123
this(DEFAULT_LOAD_FACTOR, DEFAULT_INITIAL_CAPACITY);
@@ -35,14 +27,16 @@ protected AbstractConcurrentIntegerDictionary(float loadFactor) {
3527
this(loadFactor, DEFAULT_INITIAL_CAPACITY);
3628
}
3729

38-
protected AbstractConcurrentIntegerDictionary(float loadFactor, int initCapacity) {
39-
super(loadFactor, initCapacity);
40-
}
41-
4230
protected AbstractConcurrentIntegerDictionary(int initCapacity) {
4331
this(DEFAULT_LOAD_FACTOR, initCapacity);
4432
}
4533

34+
protected AbstractConcurrentIntegerDictionary(float loadFactor, int initCapacity) {
35+
super(loadFactor, initCapacity);
36+
this.entries = ArrayUtils.create(getEntryType(), initCapacity);
37+
this.size = new AtomicInteger(0);
38+
}
39+
4640
@Override
4741
public void setEntries(@NotNull IntegerEntry<V>[] entries) {
4842
this.entries = entries;
@@ -60,7 +54,7 @@ public int getThreshold() {
6054

6155
@Override
6256
protected void setSize(int size) {
63-
this.size = size;
57+
this.size.set(size);
6458
}
6559

6660
@Override
@@ -70,18 +64,16 @@ public void setThreshold(int threshold) {
7064

7165
@Override
7266
protected int decrementSizeAndGet() {
73-
size -= 1;
74-
return size;
67+
return size.decrementAndGet();
7568
}
7669

7770
@Override
7871
protected int incrementSizeAndGet() {
79-
size += 1;
80-
return size;
72+
return size.incrementAndGet();
8173
}
8274

8375
@Override
8476
public final int size() {
85-
return size;
77+
return size.get();
8678
}
8779
}
Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.ss.rlib.common.util.dictionary;
22

3+
import com.ss.rlib.common.concurrent.atomic.AtomicInteger;
4+
import com.ss.rlib.common.util.ArrayUtils;
35
import org.jetbrains.annotations.NotNull;
46

57
/**
@@ -8,24 +10,14 @@
810
* @param <V> the type parameter
911
* @author JavaSaBr
1012
*/
11-
public abstract class AbstractConcurrentLongDictionary<V> extends AbstractLongDictionary<V>
12-
implements ConcurrentLongDictionary<V> {
13-
14-
/**
15-
* Тhe array of entries.
16-
*/
17-
@NotNull
18-
private volatile LongEntry<V>[] entries;
19-
20-
/**
21-
* The next size value at which to resize (capacity * load factor).
22-
*/
23-
private volatile int threshold;
13+
public abstract class AbstractConcurrentLongDictionary<V> extends AbstractLongDictionary<V> implements
14+
ConcurrentLongDictionary<V> {
15+
16+
private final @NotNull AtomicInteger size;
2417

25-
/**
26-
* The count of values in this {@link Dictionary}.
27-
*/
28-
private volatile int size;
18+
private volatile @NotNull LongEntry<V>[] entries;
19+
20+
private volatile int threshold;
2921

3022
protected AbstractConcurrentLongDictionary() {
3123
this(DEFAULT_LOAD_FACTOR, DEFAULT_INITIAL_CAPACITY);
@@ -41,6 +33,8 @@ protected AbstractConcurrentLongDictionary(int initCapacity) {
4133

4234
protected AbstractConcurrentLongDictionary(float loadFactor, int initCapacity) {
4335
super(loadFactor, initCapacity);
36+
this.entries = ArrayUtils.create(getEntryType(), initCapacity);
37+
this.size = new AtomicInteger(0);
4438
}
4539

4640
@Override
@@ -60,7 +54,7 @@ public int getThreshold() {
6054

6155
@Override
6256
protected void setSize(int size) {
63-
this.size = size;
57+
this.size.set(size);
6458
}
6559

6660
@Override
@@ -70,18 +64,16 @@ public void setThreshold(int threshold) {
7064

7165
@Override
7266
protected int decrementSizeAndGet() {
73-
size -= 1;
74-
return size;
67+
return size.decrementAndGet();
7568
}
7669

7770
@Override
7871
protected int incrementSizeAndGet() {
79-
size += 1;
80-
return size;
72+
return size.incrementAndGet();
8173
}
8274

8375
@Override
8476
public final int size() {
85-
return size;
77+
return size.get();
8678
}
8779
}

rlib-common/src/main/java/com/ss/rlib/common/util/dictionary/AbstractConcurrentObjectDictionary.java

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.ss.rlib.common.util.dictionary;
22

3+
import com.ss.rlib.common.concurrent.atomic.AtomicInteger;
4+
import com.ss.rlib.common.util.ArrayUtils;
35
import org.jetbrains.annotations.NotNull;
46

57
/**
@@ -9,24 +11,14 @@
911
* @param <V> the value's type.
1012
* @author JavaSaBr
1113
*/
12-
public abstract class AbstractConcurrentObjectDictionary<K, V> extends AbstractObjectDictionary<K, V>
13-
implements ConcurrentObjectDictionary<K, V> {
14-
15-
/**
16-
* Тhe array of entries.
17-
*/
18-
@NotNull
19-
private volatile ObjectEntry<K, V>[] entries;
20-
21-
/**
22-
* The next size value at which to resize (capacity * load factor).
23-
*/
24-
private volatile int threshold;
14+
public abstract class AbstractConcurrentObjectDictionary<K, V> extends AbstractObjectDictionary<K, V> implements
15+
ConcurrentObjectDictionary<K, V> {
16+
17+
private final @NotNull AtomicInteger size;
2518

26-
/**
27-
* The count of values in this {@link Dictionary}.
28-
*/
29-
private volatile int size;
19+
private volatile @NotNull ObjectEntry<K, V>[] entries;
20+
21+
private volatile int threshold;
3022

3123
protected AbstractConcurrentObjectDictionary() {
3224
this(DEFAULT_LOAD_FACTOR, DEFAULT_INITIAL_CAPACITY);
@@ -42,6 +34,8 @@ protected AbstractConcurrentObjectDictionary(int initCapacity) {
4234

4335
protected AbstractConcurrentObjectDictionary(float loadFactor, int initCapacity) {
4436
super(loadFactor, initCapacity);
37+
this.entries = ArrayUtils.create(getEntryType(), initCapacity);
38+
this.size = new AtomicInteger(0);
4539
}
4640

4741
@Override
@@ -61,7 +55,7 @@ public int getThreshold() {
6155

6256
@Override
6357
protected void setSize(int size) {
64-
this.size = size;
58+
this.size.set(size);
6559
}
6660

6761
@Override
@@ -71,18 +65,16 @@ public void setThreshold(int threshold) {
7165

7266
@Override
7367
protected int decrementSizeAndGet() {
74-
size -= 1;
75-
return size;
68+
return size.decrementAndGet();
7669
}
7770

7871
@Override
7972
protected int incrementSizeAndGet() {
80-
size += 1;
81-
return size;
73+
return size.incrementAndGet();
8274
}
8375

8476
@Override
8577
public final int size() {
86-
return size;
78+
return size.get();
8779
}
8880
}

rlib-common/src/main/java/com/ss/rlib/common/util/dictionary/AbstractDictionary.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ protected static int indexFor(int hash, int length) {
8282
protected AbstractDictionary(float loadFactor, int initCapacity) {
8383
this.loadFactor = loadFactor;
8484
this.entryPool = PoolFactory.newReusablePool(getEntryType());
85-
setEntries(ArrayUtils.create(getEntryType(), initCapacity));
8685
setThreshold((int) (initCapacity * loadFactor));
87-
setSize(0);
8886
}
8987

9088
@Override

0 commit comments

Comments
 (0)