首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在静态方法和类中同步得到不同的java字节码

为什么在静态方法和类中同步得到不同的java字节码
EN

Stack Overflow用户
提问于 2020-09-08 01:11:49
回答 1查看 46关注 0票数 1

我已经了解到在静态方法和类中同步是一回事,它们都是类级锁。

然后我试着写一个演示程序:

代码语言:javascript
复制
package com.hao.thread;

public class Main {
    private static int count = 10;

    public synchronized static void m1() {
        --count;
        System.out.println(Thread.currentThread().getName() + " count = " + count);
    }

    public static void m2() {
        synchronized (Main.class) {
            --count;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
        }
    }

    public static void main(String[] args) {

    }
}

编译后,使用jclasslib(一个idea插件)检查java字节码,发现m1()m2()得到了不同的java字节码,m1()方法的字节码中没有monitorenter

图片如下,因为我没有足够的声誉,我必须粘贴图片的直接链接

  • m1() java字节码:![m1](https://i.stack.imgur.com/QRzJ5.jpg)
  • m2() java字节码:![m2](https://i.stack.imgur.com/yrTvJ.jpg)

我想知道为什么会这样?对于不同的java字节码,它们怎么会有相同的行为呢?JVM为我做了什么额外的事情吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-08 01:15:36

参见JVM规范§17.1 - VM会看到“同步”关键字,并隐式地执行monitorenter。java字节码中有两种方法可以获得对象的锁:要么通过synchronized关键字,要么通过MONITORENTER字节码,就这样简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63785898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档