RFR: 8187033: [PPC] Imporve performance of ObjectStreamClass.getClassDataLayout()

Aleksey Shipilev shade at redhat.com
Thu Aug 31 10:28:55 UTC 2017

On 08/31/2017 12:05 PM, Kazunori Ogata wrote:
> Bug report: https://bugs.openjdk.java.net/browse/JDK-8187033
> Webrev: http://cr.openjdk.java.net/~horii/8187033/webrev.00/

Alas, this change is incorrect. It introduces the race between readers and writers of dataLayout
field. Which means, whatever writers have done in ClassDataSlot[] array is not guaranteed to be
visible to the readers of $dataLayout.

You can argue this race is benign, but it is not. ClassDataSlot has only the final fields, which is
handy. But the problem is with the ClassDataSlot[] array itself: its elements are not "final". Maybe
doing the wrapper with final field around it would help, at the expense of additional dereference, e.g.:

private DataLayout dataLayout;

class DataLayout {
  final ClassDataSlot[] slots;  // "final" is important here
  DataLayout(List<ClassDataSlot> src) {
    this.slots = src.toArray(new ClassDataSlot[src.size()];

ClassDataSlot[] getClassDataLayout() throws InvalidClassException {
  if (dataLayout == null) {
    dataLayout = getClassDataLayout0();
  return dataLayout.slots;

Plus maybe replace all declarations of ObjectStreamClass.ClassDataSlot[] with
ObjectStreamClass.DataLayout after this...


More information about the core-libs-dev mailing list