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...
Thanks,
-Aleksey
More information about the core-libs-dev
mailing list