我试图找出关键字syncronized在java内部是如何工作的。所以我写了一个非常简单的例子,并使用javap来查看字节码。
SyncTest.java
public class SyncTest {
public void sort(int[] array) {
synchronized(this) {
}
}
}
执行 javac 和 javap
F:\>javac SyncTest.java
F:\>javap -c SyncTest.class
Compiled from "SyncTest.java"
public class SyncTest {
public SyncTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public void sort(int[]);
Code:
0: aload_0
1: dup
2: astore_2
3: monitorenter
4: aload_2
5: monitorexit
6: goto 14
9: astore_3
10: aload_2
11: monitorexit
12: aload_3
13: athrow
14: return
Exception table:
from to target type
4 6 9 any
9 12 9 any
}
从上面的字节代码段中,我发现syncronized通过使用monitorenter和monitorexit在java中工作>。但是我不知道为什么只有1个monitorenter却有2个monitorexit,它们不是成对的。
最佳答案
只有一种方法可以进入同步块(synchronized block):通过通向同步块(synchronized block)的顺序执行路径。这就是为什么您会看到一条 monitorenter
指令。
然而,有两条执行路径离开同步块(synchronized block):要么通过同步块(synchronized block)末尾的顺序执行路径,要么(如果抛出异常)到某处的异常处理程序。因此,您有两条 monitorexit
指令:一条用于顺序路径(位于偏移量 5 处),另一条用于异常路径(位于偏移量 11 处)。
关于java同步: why instructions monitorenter and monitorexit does not appear in pairs in my example?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46762863/