The native code on macOS which initializes cached JNI refs is not thread safe. The fix is to use the macOS dispatch_once mechanism as a lock. The fix is essentially all in JNIUtilities.h. There's some refactoring of the macros in there to make things a bit cleaner and DECLARE_*_ONLY macros are added which the non-local clients now use to declare variables.
The problem can be demonstrated with multi-threaded initialisation, and using -Xcheck:jni A case which reproduces "fairly often" has been added as a test. --------- - [x] I confirm that I make this contribution in accordance with the [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai). ------------- Commit messages: - 8393035 - 8385973 Changes: https://git.openjdk.org/jdk/pull/33481/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=33481&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8393035 Stats: 305 lines in 27 files changed: 149 ins; 37 del; 119 mod Patch: https://git.openjdk.org/jdk/pull/33481.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/33481/head:pull/33481 PR: https://git.openjdk.org/jdk/pull/33481
