RFR JDK-8011940 : java.lang.Class.getAnnotations() always enters synchronized method

Joel Borggren-Franck joel.franck at oracle.com
Mon Aug 12 10:54:39 UTC 2013

Hi Peter,

Thank you for looking in to this!

On 2013-08-11, Peter Levart wrote:
> On 08/07/2013 06:42 PM, Aleksey Shipilev wrote:
> >Hi Peter,
> >
> >On 08/07/2013 08:18 PM, Peter Levart wrote:
> >>http://cr.openjdk.java.net/~plevart/jdk8-tl/AnnotationData/webrev.01/
> >Yeah, looks familiar. The install loop is very complicated though, can
> >we simplify it? It seems profitable to move the retry loop up into
> >annotationData(): you then don't have to pass the $annotationData, you
> >can merge the exit paths for $classRedefinedCount, etc.
> Hi Aleksey,
> Right, the retry-loop can be simplified. There are still two
> methods, but the 2nd is only a factory method now:
> http://cr.openjdk.java.net/~plevart/jdk8-tl/AnnotationData/webrev.02/

I realize the interaction between probably any reflective operation and
a redefine is blurry, but if a redefine occurs between line 3308 and 3309
annotationData() will return a possibly outdated AnnotationData. 

3307             if (Atomic.casAnnotationData(this, annotationData, newAnnotationData)) {
3308                 // successfully installed new AnnotationData

redefine here

3309                 return newAnnotationData;
3310             }

I suppose there is a sequencing of events where this will be inevitable,
but this got me thinking about the state model of annotations (and
reflective objects) through an redefine.

I think we need to be a bit more explicit about documenting that state
model. If you have a good mental model of this perhaps now is a good
time to write it down?

3326                 if (annotations == null) { // lazy construction
3327                     annotations = new HashMap<>();
3328                 }

I think this should be a LinkedHashMap, so that iteration is predictable
(I know it isn't in the current code). Also the size of the map is known
so you can use a constructor with an explicit initial capacity.

Since this is a fairly significant rewrite I think it might be good to
make sure our tests exercise the new code. Can you run some kind of
coverage report on this?

Otherwise this looks good (not an R kind of reviewer).


More information about the core-libs-dev mailing list