gpt4 book ai didi

java - 方法签名中带或不带synchronized关键字的方法具有相同的字节码

转载 作者:行者123 更新时间:2023-12-02 03:25:40 24 4
gpt4 key购买 nike

以下 2 个类具有相同的 Java 字节码。

java版本:

java version "1.8.0_181" Java(TM) SE Runtime Environment (build 1.8.0_181-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

javac 和 javap 版本:

1.8.0_181

我的疑问是

  1. 具有 synchronized 关键字的方法不应该具有不同的字节码,正如我们在 synchronized block 中看到的那样,具有 monitorenter Monitorexit,或者让我们假设我不应该混合同步块(synchronized block)同步方法然后

  2. JVM 如何以不同的方式处理这两种方法?

    public class MySingleton1 {

    private MySingleton1() {}

    private static MySingleton1 ourInstance;

    public static MySingleton1 getInstance() {
    if (ourInstance == null) {
    ourInstance = new MySingleton1();
    }
    return ourInstance;
    }
    }

    public class MySingleton2 {

    private MySingleton2() {}

    private static MySingleton2 ourInstance;

    public static synchronized MySingleton2 getInstance() {
    if (ourInstance == null) {
    ourInstance = new MySingleton2();
    }
    return ourInstance;
    }
    }

字节码如下:

$javac MySingleton1.java
$javap -c MySingleton1
$javac MySingleton2.java
$javap -c MySingleton2

各个文件的字节码:

Compiled from "MySingleton1.java"
public class MySingleton1 {
public static MySingleton1 getInstance();
descriptor: ()LMySingleton1;
Code:
0: getstatic #2 // Field ourInstance:LMySingleton1;
3: ifnonnull 16
6: new #3 // class MySingleton1
9: dup
10: invokespecial #4 // Method "<init>":()V
13: putstatic #2 // Field ourInstance:LMySingleton1;
16: getstatic #2 // Field ourInstance:LMySingleton1;
19: areturn
}

Compiled from "MySingleton2.java"
public class MySingleton2 {
public static synchronized MySingleton2 getInstance();
descriptor: ()LMySingleton2;
Code:
0: getstatic #2 // Field ourInstance:LMySingleton2;
3: ifnonnull 16
6: new #3 // class MySingleton2
9: dup
10: invokespecial #4 // Method "<init>":()V
13: putstatic #2 // Field ourInstance:LMySingleton2;
16: getstatic #2 // Field ourInstance:LMySingleton2;
19: areturn
}

我只是想增加我对java w.r.t的理解。字节码。

如果我的方法错误或者问题太微不足道,请通过评论告诉我。

欢迎任何与文档相关的引用,但以下内容除外:

https://en.wikipedia.org/wiki/Java_bytecode

https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

http://www.cnblogs.com/richaaaard/p/6214929.html

最佳答案

方法上的 synchronized 修饰符被编译到方法头中的 ACC_SYNCHRONIZED 标志中。不影响生成的字节码指令;当 JVM 看到该标志时,会隐式添加进入和退出监视器的代码。

请参阅JVM specification了解方法 header 中标志的完整列表及其含义。

关于java - 方法签名中带或不带synchronized关键字的方法具有相同的字节码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52892370/

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