On Tue, 13 Jun 2023 19:24:08 GMT, Man Cao <m...@openjdk.org> wrote:

>> Hi all,
>> 
>> Could anyone review this small fix for a data race in 
>> java.io.ClassCache$CacheRef? This fix makes the code safer by making the 
>> code data-race-free.
>
> Man Cao has updated the pull request with a new target base due to a merge or 
> a rebase. The incremental webrev excludes the unrelated changes brought in by 
> the merge/rebase. The pull request contains two additional commits since the 
> last revision:
> 
>  - Merge branch 'master' into JDK8309688
>  - 8309688: Data race on java.io.ClassCache.strongReferent

I think this data race is benign, because `ClassValue` gives us the required 
memory semantics. Introducing additional performance hogs seems weird in this 
case, see below.

Since TSAN complains about the unsynchronized conflicting accesses in 
`getStrong()` and `clearStrong()`, maybe the better solution would be marking 
`strong` as `volatile`? It would still be awkward, but we would "only" pay a 
price of volatile load on a hot path.

src/java.base/share/classes/java/io/ClassCache.java line 43:

> 41:     private static class CacheRef<T> extends SoftReference<T> {
> 42:         private final Class<?> type;
> 43:         private final AtomicReference<T> strongReferent;

This introduces a dereference and additional `AR` instance per `CacheRef`. 
Maybe it should be `AtomicReferenceFieldUpdater` or a `VarHandle`, assuming 
there are no bootstrapping issues with this code.

src/java.base/share/classes/java/io/ClassCache.java line 87:

> 85:             // This guarantees progress for at least one thread on every 
> CacheRef.
> 86:             // Clear the strong referent before returning to make the 
> cache soft.
> 87:             T strongVal = ref.getAndClearStrong();

This is a cache, so IIRC, the prevailing case is when CacheRef already exists 
in the map, and its `strong` is already `null`. So this change introduces an 
atomic op, which is mostly useless on this path. So we pay a latency price on 
most `get()`-s without much benefit.

-------------

Changes requested by shade (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/14386#pullrequestreview-1477926122
PR Review Comment: https://git.openjdk.org/jdk/pull/14386#discussion_r1228605313
PR Review Comment: https://git.openjdk.org/jdk/pull/14386#discussion_r1228607613

Reply via email to