When managing state accessed by multiple threads, ensure thread safety through appropriate synchronization mechanisms: 1. **Use thread-safe collections** for multi-threaded access:
When managing state accessed by multiple threads, ensure thread safety through appropriate synchronization mechanisms:
// Incorrect
private List<TraceListener> listeners;
// Correct
private final List<TraceListener> listeners = new CopyOnWriteArrayList<>();
LazyValue
abstractionpublic TraceManager getTraceManager() { if (traceManager == null) { traceManager = new TraceManager(); // Race condition! } return traceManager; }
// Correct - thread-safe with volatile private volatile TraceManager traceManager;
public TraceManager getTraceManager() { TraceManager result = traceManager; if (result == null) { synchronized (this) { result = traceManager; if (result == null) { traceManager = result = new TraceManager(); } } } return result; } ```
// Correct pattern for concurrent bit flag operations
private boolean set(byte bitMask) {
byte state = this.state;
for (;;) {
if ((state & bitMask) != 0) {
return false;
}
final byte newState = (byte) (state | bitMask);
// Use compareAndExchange for atomicity
byte oldState = STATE_UPDATER.compareAndExchange(this, state, newState);
if (oldState == state) {
return true;
}
state = oldState;
}
}
// Incorrect - potential race condition
private static AuthDevUIRecorder recorder;
@BuildStep
void doSomething(AuthDevUIRecorder recorder) {
AuthProcessor.recorder = recorder; // Multiple build steps might race
}
// Correct - pass local parameters
@BuildStep
void doSomething(AuthDevUIRecorder recorder) {
performOperation(recorder);
}
Enter the URL of a public GitHub repository