gpt4 book ai didi

java - 同步和非同步方法之间的jvm区别

转载 作者:搜寻专家 更新时间:2023-10-31 19:30:24 25 4
gpt4 key购买 nike

我有以下类(class):

public class SeqGenerator {

int last = 0;
volatile int lastVolatile = 0;

public int getNext() {
return last++;
}

public synchronized int getNextSync() {
return last++;
}

public int getNextVolatile() {
return lastVolatile++;
}

public void caller() {
int i1 = getNext();
int i2 = getNextSync();
int i3 = getNextVolatile();
}

}

当我查看反汇编代码时,我看不出三种方法 getNext()getNextSync()getNextVolatile( )

public int getNext();
Code:
0: aload_0
1: dup
2: getfield #2; //Field last:I
5: dup_x1
6: iconst_1
7: iadd
8: putfield #2; //Field last:I
11: ireturn

public synchronized int getNextSync();
Code:
0: aload_0
1: dup
2: getfield #2; //Field last:I
5: dup_x1
6: iconst_1
7: iadd
8: putfield #2; //Field last:I
11: ireturn

public int getNextVolatile();
Code:
0: aload_0
1: dup
2: getfield #3; //Field lastVolatile:I
5: dup_x1
6: iconst_1
7: iadd
8: putfield #3; //Field lastVolatile:I
11: ireturn

public void caller();
Code:
0: aload_0
1: invokevirtual #4; //Method getNext:()I
4: istore_1
5: aload_0
6: invokevirtual #5; //Method getNextSync:()I
9: istore_2
10: aload_0
11: invokevirtual #6; //Method getNextVolatile:()I
14: istore_3
15: return

JMV 如何区分这些方法?

生成的代码与这些方法及其调用者相同。 JVM 如何执行同步?

最佳答案

应用于方法的synchronized 关键字只是在该方法定义上设置ACC_SYNCHRONIZED 标志,如the JVM specification § 4.6 Methods 中所定义。 .它在方法的实际字节码中是不可见的。

JLS § 8.4.3.6 synchronized Methods讨论了定义 synchronized 方法和声明跨越整个方法体的 synchronized block (并使用相同的对象进行同步)的相似性:effect 完全相同,但它们在 .class 文件中的表示方式不同。

类似的效果发生在 volatile 字段上:它只是在 field ( JVM § 4.5 Fields ) 上设置 ACC_VOLATILE 标志。 访问字段的代码使用相同的字节码,但行为略有不同。

另请注意,此处使用可变字段不是线程安全的,因为x++ 在可变字段x 不是原子的!

关于java - 同步和非同步方法之间的jvm区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7657675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com