Why and how we use primitive maps
tech.trivago.com
tech.trivago.com
[1] https://docs.oracle.com/en/java/javase/17/docs/api/java.base...()
1. As you say, use onSpinWait
2. It emits a load barrier on each failed trylock call, from the underlying strong integer CAS. Ideally it would use a cas with relaxed memory order, and use an acquire fence only if successful.
3. The read path emits store barriers on release, which is unnecessary. Releasing could use a relaxed order fetch-add instruction.
It's theoretically possible that the JIT would be smart enough to optimize these with the existing code, but that's asking a lot from its analysis, including that the thread local storage writes for detecting reentrance aren't "real" writes that need to be made visible to other threads.