Skip to content

Commit 71a3645

Browse files
committed
Use locks for JctFileManagerConfigurerChain.java
Improves support for project loom threads in the future Signed-off-by: ascopes <[email protected]>
1 parent 19c93d3 commit 71a3645

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

java-compiler-testing/src/main/java/io/github/ascopes/jct/filemanagers/config/JctFileManagerConfigurerChain.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.util.ArrayDeque;
2020
import java.util.Deque;
2121
import java.util.List;
22+
import java.util.concurrent.locks.Lock;
23+
import java.util.concurrent.locks.ReentrantLock;
2224
import org.apiguardian.api.API;
2325
import org.apiguardian.api.API.Status;
2426
import org.slf4j.Logger;
@@ -28,8 +30,8 @@
2830
* A chain of configurers to apply to a file manager.
2931
*
3032
* <p>While not designed for concurrent use, all operations are shielded by a
31-
* mutex to guard against potentially confusing behaviour should this component
32-
* be shared across multiple threads.
33+
* lock to guard against potentially confusing behaviour, should this component
34+
* be shared across multiple physical and virtual threads.
3335
*
3436
* @author Ashley Scopes
3537
* @since 0.0.1
@@ -39,14 +41,14 @@ public final class JctFileManagerConfigurerChain {
3941

4042
private static final Logger LOGGER = LoggerFactory.getLogger(JctFileManagerConfigurerChain.class);
4143

42-
private final Object lock;
44+
private final Lock lock;
4345
private final Deque<JctFileManagerConfigurer> configurers;
4446

4547
/**
4648
* Initialise this chain.
4749
*/
4850
public JctFileManagerConfigurerChain() {
49-
lock = new Object();
51+
lock = new ReentrantLock();
5052
configurers = new ArrayDeque<>(16);
5153
}
5254

@@ -57,8 +59,11 @@ public JctFileManagerConfigurerChain() {
5759
* @return this chain for further calls.
5860
*/
5961
public JctFileManagerConfigurerChain addFirst(JctFileManagerConfigurer configurer) {
60-
synchronized (lock) {
62+
lock.lock();
63+
try {
6164
configurers.addFirst(configurer);
65+
} finally {
66+
lock.unlock();
6267
}
6368
return this;
6469
}
@@ -70,8 +75,11 @@ public JctFileManagerConfigurerChain addFirst(JctFileManagerConfigurer configure
7075
* @return this chain for further calls.
7176
*/
7277
public JctFileManagerConfigurerChain addLast(JctFileManagerConfigurer configurer) {
73-
synchronized (lock) {
78+
lock.lock();
79+
try {
7480
configurers.addLast(configurer);
81+
} finally {
82+
lock.unlock();
7583
}
7684
return this;
7785
}
@@ -82,8 +90,11 @@ public JctFileManagerConfigurerChain addLast(JctFileManagerConfigurer configurer
8290
* @return the list of configurers.
8391
*/
8492
public List<JctFileManagerConfigurer> list() {
85-
synchronized (lock) {
93+
lock.lock();
94+
try {
8695
return List.copyOf(configurers);
96+
} finally {
97+
lock.unlock();
8798
}
8899
}
89100

@@ -95,7 +106,8 @@ public List<JctFileManagerConfigurer> list() {
95106
* parameter, depending on how the configurers manipulate the input object.
96107
*/
97108
public JctFileManager configure(JctFileManager fileManager) {
98-
synchronized (lock) {
109+
lock.lock();
110+
try {
99111
for (var configurer : configurers) {
100112
if (configurer.isEnabled()) {
101113
LOGGER.debug("Applying {} to file manager", configurer);
@@ -104,6 +116,8 @@ public JctFileManager configure(JctFileManager fileManager) {
104116
LOGGER.trace("Skipping {}", configurer);
105117
}
106118
}
119+
} finally {
120+
lock.unlock();
107121
}
108122

109123
return fileManager;

0 commit comments

Comments
 (0)