我已经了解到在静态方法和类中同步是一回事,它们都是类级锁。
然后我试着写一个演示程序:
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字节码:m2() java字节码:我想知道为什么会这样?对于不同的java字节码,它们怎么会有相同的行为呢?JVM为我做了什么额外的事情吗?
发布于 2020-09-08 01:15:36
参见JVM规范§17.1 - VM会看到“同步”关键字,并隐式地执行monitorenter。java字节码中有两种方法可以获得对象的锁:要么通过synchronized关键字,要么通过MONITORENTER字节码,就这样简单。
https://stackoverflow.com/questions/63785898
复制相似问题