- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图找出关键字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/
我试图找出关键字syncronized在java内部是如何工作的。所以我写了一个非常简单的例子,并使用javap来查看字节码。 SyncTest.java public class SyncTest
我反编译了一个源文件,发现了一些JVM指令,比如JVM INSTR monitorenter和JVM INSTR monitorexit。这些是什么意思? public boolean isRunni
当我们编写 synchronized(some_object){} 时,我们可以看到两条 JVM 指令 monitorenter/monitorexit 作为字节码发出。 当我们编写 synchron
我是一名优秀的程序员,十分优秀!