synchronized 关键字的锁有静态态方法锁,锁是所在类的class文件,非静态方法里代码块的synchronized(this)锁,和非静态方法锁的对象是一致的。synchronized(类的class)等。原理就是对象。
1、静态方法的锁是所在类的 class 文件。
// 静态方法
public static synchronized void test(){};
备注:静态方法里不能使用 this 关键字,因为调用静态方法时堆内存里不生成对象。
2、非静态方法锁,锁其实是 this,也就是在堆内存里new出来的那个对象。
// 非静态方法
public synchronized void test(){};
3、代码块锁,锁是this关键字。指堆内存里 new 的那个对象。
public void test(){
synchronized(this){
// 代码块
}
}
4、锁是某个类的字节码,一个类可以有多个字节码,只会有一个class源文件。
public void test(){
synchronized(Car.class){
// 代码块
}
}