After a call to `ClassValue.remove`, a `ClassValue` can still install a value that is computed with information that is not up-to-date with the remove call. This is demonstrated in the test case, where an innocuous `ClassValue.get` call on an uncomputed CV may happen to compute during which a remove happened, and proceed to install an outdated value onto a CV.
The fix is simple - to force computation to retry when a remove has happened, so the retry can observe the up-to-date states from the remove. (finishEntry and removeEntry are both synchronized on the object monitor of the ClassValueMap instance) ------------- Commit messages: - 8351045: ClassValue::remove cannot ensure computation observes up-to-date state Changes: https://git.openjdk.org/jdk/pull/23866/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=23866&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8351045 Stats: 81 lines in 2 files changed: 61 ins; 3 del; 17 mod Patch: https://git.openjdk.org/jdk/pull/23866.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/23866/head:pull/23866 PR: https://git.openjdk.org/jdk/pull/23866