连续几次对同一把锁加锁,JIT 会合并成一次吗?局部对象上的同步会被拿掉吗?这篇用开关对照量出每次调用的耗时,不靠猜,也看看字节码里到底有没有变化。
A 局部 StringBuffer 三次 append
默认 18.28
-XX:-EliminateLocks 29.91
-XX:-DoEscapeAnalysis 42.21
-XX:-EliminateLocks -XX:-DoEscapeAnalysis 32.02
-Xint(解释执行,对照) 857.73
B 同一共享锁连续 3 个 synchronized 块
默认 5.13
-XX:-EliminateLocks 15.3
-XX:-DoEscapeAnalysis 5.11
-XX:-EliminateLocks -XX:-DoEscapeAnalysis 15.3
C 循环内每次迭代加锁(共享锁)
默认 1.43
-XX:-EliminateLocks 5.14
-XX:-DoEscapeAnalysis 1.49
-XX:-EliminateLocks -XX:-DoEscapeAnalysis 5.14
D 锁一个局部 new Object()
默认 1.92
-XX:-EliminateLocks 6.46
-XX:-DoEscapeAnalysis 6.48
-XX:-EliminateLocks -XX:-DoEscapeAnalysis 6.43
E 局部 Vector 两次 add
默认 2.6
-XX:-EliminateLocks 25.17
-XX:-DoEscapeAnalysis 20.64
-XX:-EliminateLocks -XX:-DoEscapeAnalysis 25.71JDK 27 A 局部 StringBuffer 三次 a 默认 12.94 JDK 27 A 局部 StringBuffer 三次 a -XX:-EliminateLocks 29.54 JDK 27 B 同一共享锁连续 3 个 synchron 默认 5.6 JDK 27 B 同一共享锁连续 3 个 synchron -XX:-EliminateLocks 16.99 JDK 27 D 锁一个局部 new Object() 默认 1.86 JDK 27 D 锁一个局部 new Object() -XX:-EliminateLocks 6.22
方法 b:monitorenter 3 个,monitorexit 6 个(每个 synchronized 块 1 个 enter、2 个 exit:正常路径 + 异常路径) a(StringBuffer)的 invokevirtual append:3