synchronization on non-escaping objects
Vladimir Kozlov
Vladimir.Kozlov at Sun.COM
Thu Nov 19 15:29:56 PST 2009
>
> private final char X = 'x';
> synchronized (this) {
> return X;
> }
Since X field is final C2 optimizer returns value 'x'
without loading it from object's field:
059 MOV EAX,#120
There are no operations left between acquiring and releasing the lock.
Also no instructions are generated for MEMBARs you pointed -
look on instructions address. They are printed for debugging purpose.
They are empty because they are not needed for an object which
is biased locked for the current thread. And slow code has CMPXCHG
which is treated as MEMBAR.
Vladimir
Vijay Kandy wrote:
> Vladimir,
>
> Thanks for the reply. I didn't think of the implicit 'this' input
> parameter that escapes. It makes sense now.
>
> If I could ask one more question - what does it mean when there are no
> instructions between MEMBAR-acquire and MEMBAR-release as in B3? I
> mean, what's the purpose of acquire/release in this scenario:
>
> 051 B3: # B8 B4 <- B7 B6 B2 B14 Freq: 1
> 051 MEMBAR-acquire (prior CMPXCHG in FastLock so empty encoding)
> 051 MEMBAR-release ! (empty encoding)
> 051 MOV ECX,#7
> 056 AND ECX,[EBP]
> 059 CMP ECX,#5
> 05c Jne,s B8 P=0.000001 C=-1.000000
>
> Regards,
> Vijay
>
> On Thu, Nov 19, 2009 at 1:03 PM, Vladimir Kozlov
> <Vladimir.Kozlov at sun.com> wrote:
>> 'this' object is input parameter for getX() so it escapes
>> and full synchronization code is generated. What you see in
>> B1 and B2 is biased locking code which checks if the object
>> is locked by current thread if not it goes to slow path.
>>
>> When you synchronize on 'new Object()' - it does not escape
>> (no other threads can access it) so synchronization code and
>> the object is eliminated.
>>
>> Vladimir
>>
More information about the hotspot-dev
mailing list