[PATCH] remove redundant initialization of volatile fields with default values
David Holmes
david.holmes at oracle.com
Fri Jun 19 13:25:45 UTC 2020
Hi Remi,
On 19/06/2020 6:03 pm, Remi Forax wrote:
> Hi Sergei,
> the problem is that you are changing the semantics if there are several fields.
>
> By example with the code below, you have the guarantee that the code will print 4 (if it prints something),
> if you remove the assignment field = false, the code can print 0 or 4.
>
> class A {
> int i = 4;
> volatile boolean field = false;
> }
>
> thread 1:
> global = new A()
>
> thread 2:
> var a = global;
> if (a != null) {
> System.out.println(a.i);
> }
Surely you intended to read field to get the volatile read to pair with
the volatile write of the initializer? Otherwise there is no
happens-before ordering.
David
> regards,
> Rémi
>
> ----- Mail original -----
>> De: "Сергей Цыпанов" <sergei.tsypanov at yandex.ru>
>> À: "core-libs-dev" <core-libs-dev at openjdk.java.net>
>> Envoyé: Vendredi 19 Juin 2020 06:57:25
>> Objet: [PATCH] remove redundant initialization of volatile fields with default values
>
>> Hello,
>>
>> while investigating an issue I've found out that assignment of default value to
>> volatile fields slows down object instantiation.
>>
>> Consider the benchmark:
>>
>> @State(Scope.Thread)
>> @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> @BenchmarkMode(value = Mode.AverageTime)
>> @Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
>> public class VolatileFieldBenchmark {
>> @Benchmark
>> public Object explicitInit() {
>> return new ExplicitInit();
>> }
>>
>> @Benchmark
>> public Object noInit() {
>> return new NoInit();
>> }
>>
>> private static class ExplicitInit {
>> private volatile boolean field = false;
>> }
>> private static class NoInit {
>> private volatile boolean field;
>> }
>> }
>>
>> This gives the following results as of my machine:
>>
>> Benchmark Mode Cnt Score Error Units
>> VolatileFieldBenchmark.explicitInit avgt 40 11.087 ± 0.140 ns/op
>> VolatileFieldBenchmark.noInit avgt 40 3.367 ± 0.131 ns/op
>>
>>
>> I've looked into source code of java.base and found out several cases where the
>> default value is assigned to volatile field.
>>
>> Getting rid of such assignements demonstates improvement as of object
>> instantiation, e.g. javax.security.auth.Subject:
>>
>> Mode Cnt Score Error Units
>> before avgt 40 35.933 ± 2.647 ns/op
>> after avgt 40 30.817 ± 2.384 ns/op
>>
>> As of testing tier1 and tier2 are both ok after the changes.
>>
>> Best regards,
>> Sergey Tsypanov
More information about the core-libs-dev
mailing list