RFR: 8377850: AbstractPrimaryTimer: concurrent addAnimationTimer() causes lost timers and hangs
Florian Kirmaier
fkirmaier at openjdk.org
Thu Feb 12 23:09:19 UTC 2026
Add `synchronized(lock)` around array mutations in `addPulseReceiver`/`removePulseReceiver`/`addAnimationTimer`/`removeAnimationTimer` and around snapshot-taking in `timePulseImpl`. Iteration remains outside the lock. `updateAnimationRunnable()` is also called outside the lock to avoid nested locking.
This preserves the existing copy-on-write design - the lock just ensures it works correctly across threads. Performance impact is minimal: the lock only covers field reads/writes, not the per-frame iteration.
**Testing:**
New `AbstractPrimaryTimerThreadSafetyTest` with `testConcurrentAddAnimationTimer` - 8 threads add timers simultaneously, repeated 100 times. Fails 100% without fix. Reuses `AbstractPrimaryTimerStub` from existing tests.
All existing animation tests pass.
In JPro, this often caused a Deadlock during startup.
This might have caused many bugs, which are very hard to reproduce.
-------------
Commit messages:
- JDK-8377850
Changes: https://git.openjdk.org/jfx/pull/2074/files
Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=2074&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8377850
Stats: 206 lines in 3 files changed: 142 ins; 9 del; 55 mod
Patch: https://git.openjdk.org/jfx/pull/2074.diff
Fetch: git fetch https://git.openjdk.org/jfx.git pull/2074/head:pull/2074
PR: https://git.openjdk.org/jfx/pull/2074
More information about the openjfx-dev
mailing list