Skip to content

Commit 8a44acb

Browse files
Koziolekpivovarit
authored andcommitted
Replace synchronized blocks with virtual-threads-friendly lock in Functions generator (#2909)
I replaced synchronized blocks with `Lock` because of virtual threads. More details: https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html#GUID-04C03FFC-066D-4857-85B9-E5A27A875AF9 Similar to #2845
1 parent e6400d2 commit 8a44acb

17 files changed

+106
-18
lines changed

vavr/generator/Generator.scala

+10-2
Original file line numberDiff line numberDiff line change
@@ -1752,29 +1752,37 @@ def generateMainClasses(): Unit = {
17521752
"""}
17531753
""" else if (i == 1) xs"""
17541754
final ${im.getType("java.util.Map")}<$generics, R> cache = new ${im.getType("java.util.HashMap")}<>();
1755+
final ${im.getType("java.util.concurrent.locks.ReentrantLock")} lock = new ${im.getType("java.util.concurrent.locks.ReentrantLock")}();
17551756
return ($className$fullGenerics & Memoized) ($params) -> {
1756-
synchronized (cache) {
1757+
lock.lock();
1758+
try {
17571759
if (cache.containsKey($params)) {
17581760
return cache.get($params);
17591761
} else {
17601762
final R value = apply($params);
17611763
cache.put($params, value);
17621764
return value;
17631765
}
1766+
} finally {
1767+
lock.unlock();
17641768
}
17651769
};
17661770
""" else xs"""
17671771
final ${im.getType("java.util.Map")}<Tuple$i<$generics>, R> cache = new ${im.getType("java.util.HashMap")}<>();
1772+
final ${im.getType("java.util.concurrent.locks.ReentrantLock")} lock = new ${im.getType("java.util.concurrent.locks.ReentrantLock")}();
17681773
return ($className$fullGenerics & Memoized) ($params) -> {
17691774
final Tuple$i$genericsTuple key = Tuple.of($params);
1770-
synchronized (cache) {
1775+
lock.lock();
1776+
try {
17711777
if (cache.containsKey(key)) {
17721778
return cache.get(key);
17731779
} else {
17741780
final R value = tupled().apply(key);
17751781
cache.put(key, value);
17761782
return value;
17771783
}
1784+
} finally {
1785+
lock.unlock();
17781786
}
17791787
};
17801788
"""}

vavr/src-gen/main/java/io/vavr/CheckedFunction1.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashMap;
3232
import java.util.Map;
3333
import java.util.Objects;
34+
import java.util.concurrent.locks.ReentrantLock;
3435
import java.util.function.Function;
3536

3637
/**
@@ -207,15 +208,19 @@ default CheckedFunction1<T1, R> memoized() {
207208
return this;
208209
} else {
209210
final Map<T1, R> cache = new HashMap<>();
211+
final ReentrantLock lock = new ReentrantLock();
210212
return (CheckedFunction1<T1, R> & Memoized) (t1) -> {
211-
synchronized (cache) {
213+
lock.lock();
214+
try {
212215
if (cache.containsKey(t1)) {
213216
return cache.get(t1);
214217
} else {
215218
final R value = apply(t1);
216219
cache.put(t1, value);
217220
return value;
218221
}
222+
} finally {
223+
lock.unlock();
219224
}
220225
};
221226
}

vavr/src-gen/main/java/io/vavr/CheckedFunction2.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashMap;
3232
import java.util.Map;
3333
import java.util.Objects;
34+
import java.util.concurrent.locks.ReentrantLock;
3435
import java.util.function.BiFunction;
3536
import java.util.function.Function;
3637

@@ -215,16 +216,20 @@ default CheckedFunction2<T1, T2, R> memoized() {
215216
return this;
216217
} else {
217218
final Map<Tuple2<T1, T2>, R> cache = new HashMap<>();
219+
final ReentrantLock lock = new ReentrantLock();
218220
return (CheckedFunction2<T1, T2, R> & Memoized) (t1, t2) -> {
219221
final Tuple2<T1, T2> key = Tuple.of(t1, t2);
220-
synchronized (cache) {
222+
lock.lock();
223+
try {
221224
if (cache.containsKey(key)) {
222225
return cache.get(key);
223226
} else {
224227
final R value = tupled().apply(key);
225228
cache.put(key, value);
226229
return value;
227230
}
231+
} finally {
232+
lock.unlock();
228233
}
229234
};
230235
}

vavr/src-gen/main/java/io/vavr/CheckedFunction3.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashMap;
3232
import java.util.Map;
3333
import java.util.Objects;
34+
import java.util.concurrent.locks.ReentrantLock;
3435
import java.util.function.Function;
3536

3637
/**
@@ -232,16 +233,20 @@ default CheckedFunction3<T1, T2, T3, R> memoized() {
232233
return this;
233234
} else {
234235
final Map<Tuple3<T1, T2, T3>, R> cache = new HashMap<>();
236+
final ReentrantLock lock = new ReentrantLock();
235237
return (CheckedFunction3<T1, T2, T3, R> & Memoized) (t1, t2, t3) -> {
236238
final Tuple3<T1, T2, T3> key = Tuple.of(t1, t2, t3);
237-
synchronized (cache) {
239+
lock.lock();
240+
try {
238241
if (cache.containsKey(key)) {
239242
return cache.get(key);
240243
} else {
241244
final R value = tupled().apply(key);
242245
cache.put(key, value);
243246
return value;
244247
}
248+
} finally {
249+
lock.unlock();
245250
}
246251
};
247252
}

vavr/src-gen/main/java/io/vavr/CheckedFunction4.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashMap;
3232
import java.util.Map;
3333
import java.util.Objects;
34+
import java.util.concurrent.locks.ReentrantLock;
3435
import java.util.function.Function;
3536

3637
/**
@@ -251,16 +252,20 @@ default CheckedFunction4<T1, T2, T3, T4, R> memoized() {
251252
return this;
252253
} else {
253254
final Map<Tuple4<T1, T2, T3, T4>, R> cache = new HashMap<>();
255+
final ReentrantLock lock = new ReentrantLock();
254256
return (CheckedFunction4<T1, T2, T3, T4, R> & Memoized) (t1, t2, t3, t4) -> {
255257
final Tuple4<T1, T2, T3, T4> key = Tuple.of(t1, t2, t3, t4);
256-
synchronized (cache) {
258+
lock.lock();
259+
try {
257260
if (cache.containsKey(key)) {
258261
return cache.get(key);
259262
} else {
260263
final R value = tupled().apply(key);
261264
cache.put(key, value);
262265
return value;
263266
}
267+
} finally {
268+
lock.unlock();
264269
}
265270
};
266271
}

vavr/src-gen/main/java/io/vavr/CheckedFunction5.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashMap;
3232
import java.util.Map;
3333
import java.util.Objects;
34+
import java.util.concurrent.locks.ReentrantLock;
3435
import java.util.function.Function;
3536

3637
/**
@@ -271,16 +272,20 @@ default CheckedFunction5<T1, T2, T3, T4, T5, R> memoized() {
271272
return this;
272273
} else {
273274
final Map<Tuple5<T1, T2, T3, T4, T5>, R> cache = new HashMap<>();
275+
final ReentrantLock lock = new ReentrantLock();
274276
return (CheckedFunction5<T1, T2, T3, T4, T5, R> & Memoized) (t1, t2, t3, t4, t5) -> {
275277
final Tuple5<T1, T2, T3, T4, T5> key = Tuple.of(t1, t2, t3, t4, t5);
276-
synchronized (cache) {
278+
lock.lock();
279+
try {
277280
if (cache.containsKey(key)) {
278281
return cache.get(key);
279282
} else {
280283
final R value = tupled().apply(key);
281284
cache.put(key, value);
282285
return value;
283286
}
287+
} finally {
288+
lock.unlock();
284289
}
285290
};
286291
}

vavr/src-gen/main/java/io/vavr/CheckedFunction6.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashMap;
3232
import java.util.Map;
3333
import java.util.Objects;
34+
import java.util.concurrent.locks.ReentrantLock;
3435
import java.util.function.Function;
3536

3637
/**
@@ -292,16 +293,20 @@ default CheckedFunction6<T1, T2, T3, T4, T5, T6, R> memoized() {
292293
return this;
293294
} else {
294295
final Map<Tuple6<T1, T2, T3, T4, T5, T6>, R> cache = new HashMap<>();
296+
final ReentrantLock lock = new ReentrantLock();
295297
return (CheckedFunction6<T1, T2, T3, T4, T5, T6, R> & Memoized) (t1, t2, t3, t4, t5, t6) -> {
296298
final Tuple6<T1, T2, T3, T4, T5, T6> key = Tuple.of(t1, t2, t3, t4, t5, t6);
297-
synchronized (cache) {
299+
lock.lock();
300+
try {
298301
if (cache.containsKey(key)) {
299302
return cache.get(key);
300303
} else {
301304
final R value = tupled().apply(key);
302305
cache.put(key, value);
303306
return value;
304307
}
308+
} finally {
309+
lock.unlock();
305310
}
306311
};
307312
}

vavr/src-gen/main/java/io/vavr/CheckedFunction7.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashMap;
3232
import java.util.Map;
3333
import java.util.Objects;
34+
import java.util.concurrent.locks.ReentrantLock;
3435
import java.util.function.Function;
3536

3637
/**
@@ -314,16 +315,20 @@ default CheckedFunction7<T1, T2, T3, T4, T5, T6, T7, R> memoized() {
314315
return this;
315316
} else {
316317
final Map<Tuple7<T1, T2, T3, T4, T5, T6, T7>, R> cache = new HashMap<>();
318+
final ReentrantLock lock = new ReentrantLock();
317319
return (CheckedFunction7<T1, T2, T3, T4, T5, T6, T7, R> & Memoized) (t1, t2, t3, t4, t5, t6, t7) -> {
318320
final Tuple7<T1, T2, T3, T4, T5, T6, T7> key = Tuple.of(t1, t2, t3, t4, t5, t6, t7);
319-
synchronized (cache) {
321+
lock.lock();
322+
try {
320323
if (cache.containsKey(key)) {
321324
return cache.get(key);
322325
} else {
323326
final R value = tupled().apply(key);
324327
cache.put(key, value);
325328
return value;
326329
}
330+
} finally {
331+
lock.unlock();
327332
}
328333
};
329334
}

vavr/src-gen/main/java/io/vavr/CheckedFunction8.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.HashMap;
3232
import java.util.Map;
3333
import java.util.Objects;
34+
import java.util.concurrent.locks.ReentrantLock;
3435
import java.util.function.Function;
3536

3637
/**
@@ -337,16 +338,20 @@ default CheckedFunction8<T1, T2, T3, T4, T5, T6, T7, T8, R> memoized() {
337338
return this;
338339
} else {
339340
final Map<Tuple8<T1, T2, T3, T4, T5, T6, T7, T8>, R> cache = new HashMap<>();
341+
final ReentrantLock lock = new ReentrantLock();
340342
return (CheckedFunction8<T1, T2, T3, T4, T5, T6, T7, T8, R> & Memoized) (t1, t2, t3, t4, t5, t6, t7, t8) -> {
341343
final Tuple8<T1, T2, T3, T4, T5, T6, T7, T8> key = Tuple.of(t1, t2, t3, t4, t5, t6, t7, t8);
342-
synchronized (cache) {
344+
lock.lock();
345+
try {
343346
if (cache.containsKey(key)) {
344347
return cache.get(key);
345348
} else {
346349
final R value = tupled().apply(key);
347350
cache.put(key, value);
348351
return value;
349352
}
353+
} finally {
354+
lock.unlock();
350355
}
351356
};
352357
}

vavr/src-gen/main/java/io/vavr/Function1.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.HashMap;
3030
import java.util.Map;
3131
import java.util.Objects;
32+
import java.util.concurrent.locks.ReentrantLock;
3233
import java.util.function.Function;
3334
import java.util.function.Predicate;
3435

@@ -206,15 +207,19 @@ default Function1<T1, R> memoized() {
206207
return this;
207208
} else {
208209
final Map<T1, R> cache = new HashMap<>();
210+
final ReentrantLock lock = new ReentrantLock();
209211
return (Function1<T1, R> & Memoized) (t1) -> {
210-
synchronized (cache) {
212+
lock.lock();
213+
try {
211214
if (cache.containsKey(t1)) {
212215
return cache.get(t1);
213216
} else {
214217
final R value = apply(t1);
215218
cache.put(t1, value);
216219
return value;
217220
}
221+
} finally {
222+
lock.unlock();
218223
}
219224
};
220225
}

vavr/src-gen/main/java/io/vavr/Function2.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.HashMap;
3030
import java.util.Map;
3131
import java.util.Objects;
32+
import java.util.concurrent.locks.ReentrantLock;
3233
import java.util.function.BiFunction;
3334
import java.util.function.Function;
3435

@@ -213,16 +214,20 @@ default Function2<T1, T2, R> memoized() {
213214
return this;
214215
} else {
215216
final Map<Tuple2<T1, T2>, R> cache = new HashMap<>();
217+
final ReentrantLock lock = new ReentrantLock();
216218
return (Function2<T1, T2, R> & Memoized) (t1, t2) -> {
217219
final Tuple2<T1, T2> key = Tuple.of(t1, t2);
218-
synchronized (cache) {
220+
lock.lock();
221+
try {
219222
if (cache.containsKey(key)) {
220223
return cache.get(key);
221224
} else {
222225
final R value = tupled().apply(key);
223226
cache.put(key, value);
224227
return value;
225228
}
229+
} finally {
230+
lock.unlock();
226231
}
227232
};
228233
}

vavr/src-gen/main/java/io/vavr/Function3.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.HashMap;
3030
import java.util.Map;
3131
import java.util.Objects;
32+
import java.util.concurrent.locks.ReentrantLock;
3233
import java.util.function.Function;
3334

3435
/**
@@ -230,16 +231,20 @@ default Function3<T1, T2, T3, R> memoized() {
230231
return this;
231232
} else {
232233
final Map<Tuple3<T1, T2, T3>, R> cache = new HashMap<>();
234+
final ReentrantLock lock = new ReentrantLock();
233235
return (Function3<T1, T2, T3, R> & Memoized) (t1, t2, t3) -> {
234236
final Tuple3<T1, T2, T3> key = Tuple.of(t1, t2, t3);
235-
synchronized (cache) {
237+
lock.lock();
238+
try {
236239
if (cache.containsKey(key)) {
237240
return cache.get(key);
238241
} else {
239242
final R value = tupled().apply(key);
240243
cache.put(key, value);
241244
return value;
242245
}
246+
} finally {
247+
lock.unlock();
243248
}
244249
};
245250
}

vavr/src-gen/main/java/io/vavr/Function4.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.HashMap;
3030
import java.util.Map;
3131
import java.util.Objects;
32+
import java.util.concurrent.locks.ReentrantLock;
3233
import java.util.function.Function;
3334

3435
/**
@@ -249,16 +250,20 @@ default Function4<T1, T2, T3, T4, R> memoized() {
249250
return this;
250251
} else {
251252
final Map<Tuple4<T1, T2, T3, T4>, R> cache = new HashMap<>();
253+
final ReentrantLock lock = new ReentrantLock();
252254
return (Function4<T1, T2, T3, T4, R> & Memoized) (t1, t2, t3, t4) -> {
253255
final Tuple4<T1, T2, T3, T4> key = Tuple.of(t1, t2, t3, t4);
254-
synchronized (cache) {
256+
lock.lock();
257+
try {
255258
if (cache.containsKey(key)) {
256259
return cache.get(key);
257260
} else {
258261
final R value = tupled().apply(key);
259262
cache.put(key, value);
260263
return value;
261264
}
265+
} finally {
266+
lock.unlock();
262267
}
263268
};
264269
}

0 commit comments

Comments
 (0)