synchronization on non-escaping objects

Vladimir Kozlov Vladimir.Kozlov at Sun.COM
Thu Nov 19 12:03:41 PST 2009


'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

Vijay Kandy wrote:
> Hello,
> 
> I am trying to understand synchronization on non-escaping objects. The
> JIT'd code isn't very clear to me so I am looking for some help here.
> When getX() in Test class gets compiled, Hotspot (fastdebug jdk6
> update 18) generates the following code:
> 
> public class Test {
> 	private final char X = 'x';
> 
> 	public char getX() {
> 		synchronized (this) {
> 			return X;
> 		}
> 	}
> }
> 
> getX() method when +XX:+DoEscapeAnalysis is used:
> 
> 00c   B1: #	B6 B2 <- BLOCK HEAD IS JUNK   Freq: 1
> 00c   	# stack bang
> 	PUSHL  EBP
> 	SUB    ESP,24	# Create frame
> 01a   	MOV    EBP,ECX
> 01c   	MOV    EAX,[ECX]	# int
> 01e   	MOV    EBX,EAX
> 020   	AND    EBX,#7
> 023   	CMP    EBX,#5
> 026   	Jne,s  B6  P=0.000001 C=-1.000000
> 026
> 028   B2: #	B10 B3 <- B1  Freq: 0.999999
> 028   	MOV    ECX,FS:[0x00]
> 02f   	MOV    ESI,[ECX + TLS::thread_ptr_offset()]
> 035   	MOV    EBX,precise klass Test: 0x0406c610:Constant:exact *
> 03a   	MOV    ECX,[EBX + #104]	# int
> 03d   	MOV    EDI,ECX
> 03f   	OR     EDI,ESI
> 041   	MOV    EBX,EDI
> 043   	XOR    EBX,EAX
> 045   	TEST   EBX,#-121
> 04b   	Jne    B10  P=0.000001 C=-1.000000
> 04b
> 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
> 05c
> 05e   B4: #	N152 <- B9 B8 B3  Freq: 1
> 05e   	MOV    EAX,#120
> 063   	ADD    ESP,24	# Destroy frame
> 	POPL   EBP
> 	TEST   PollPage,EAX	! Poll Safepoint
> 	
> 06d   	RET
> 
> 
> The label B6 does a FASTLOCK and B8 does a FASTUNLOCK. As there are no
> instructions between MEMBAR-acquire and MEMBAR-release, does that mean
> synchronization is elided? What purpose do they serve in this
> scenario?
> 
> However, when I re-write the method as shown below:
> 
> public char getX() {
> 	synchronized (new Object()) {
> 		return X; // final field
> 	}
> }
> 
> the method is compiled as follows:
> 
> 00c   B1: #	N14 <- BLOCK HEAD IS JUNK   Freq: 1
> 00c   	PUSHL  EBP
> 	SUB    ESP,8	# Create frame
> 013   	MOV    EAX,#120
> 018   	ADD    ESP,8	# Destroy frame
> 	POPL   EBP
> 	TEST   PollPage,EAX	! Poll Safepoint
> 	
> 022   	RET
> 
> Also, I'd deeply appreciate the kindness if someone can compare the 2
> method bodies and explain why they are compiled differently.
> 
> Regards,
> Vijay


More information about the hotspot-dev mailing list