On Sun, 19 Feb 2023 18:41:18 GMT, liach <d...@openjdk.org> wrote:

> 8302822: Method/Field/Constructor/RecordComponent::getGenericInfo() is not 
> thread safe

Hello @liach, I don't follow what this change is achieving. I think I might be 
missing something though. I read through the linked JIRA which states:

> In the getGenericInfo() methods of Method, Field, Constructor, and 
> RecordComponent, the genericInfo field is read twice, and the second read 
> returned may be null under race conditions.

Considering the `Constructor` class as an example, which looks like this:


@Override
    ConstructorRepository getGenericInfo() {
        // lazily initialize repository if necessary
        if (genericInfo == null) {
            // create and cache generic info repository
            genericInfo =
                ConstructorRepository.make(getSignature(),
                                           getFactory());
        }
        return genericInfo; //return cached repository
    }

I can understand that the `ConstructorRepository.make(getSignature(), 
getFactory());` might end up getting called more than once in case of race (or 
if ConstructorRepository.make(getSignature(), getFactory()) really returns 
null), but those should be harmless races. Plus, the getSignature() isn't 
expensive, since it returns an already assigned `final` field.
Is there some other race condition here?

The JBS issue also states:

> Class::getGenericInfo() originally had the same issue, but was fixed in 
> 8016236.

I had a look at the RFR 
https://mail.openjdk.org/pipermail/core-libs-dev/2013-June/017798.html. That's 
a slightly different issue, from what I understand. In that case, the call to 
getGenericInfo() was being preceded by a call to some other expensive method. 
The change there proposed to first call getGenericInfo() and let it be 
initialized and only then decide whether to call the other expensive methods.
In that change, I can see that the `getGenericInfo()` method on the `Class` 
class was changed too and that change is almost similar to what's being 
proposed in this current PR. However, `Class.genericInfo` field is `volatile` 
and I think that's why Doug changed that method to first write it to a local 
field and then use that local field for the rest of the work. In the current PR 
however, which touches `Field`, `Method`, `Constructor` and `RecordComponent`, 
the `genericInfo` isn't a `volatile` field in any of those classes, so I don't 
see why this local assignment is needed or would help. Am I missing something?

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

PR: https://git.openjdk.org/jdk/pull/12643

Reply via email to