Java中修饰方法的 synchronized 与 static synchronized

当需要对方法进行控制以防该方法被同时调用时,往往需要使用synchronized 与 static synchronized 对方法进行修饰。

如果从同步控制块的角度理解它们两个,问题会变得十分简单。

synchronized void method1() {
    //code here
}
//相当于
void method1() {
    synchronized(this) {
        //code here
    }
}
/*******************************************/
static synchronized method2() {
    //code here
}
//相当于
static method2() {
    synchronized(this.getClass()) {
        //code here
    }
}

可以看出,非静态synchronized方法相当于使用对象的this作为锁,由于同一对象具有相同的this,因此不能在同一个对象内同时调用两个非静态synchronized方法

而静态synchronized方法相当于使用对象对应类作为锁,即使是同一类的不同对象,它们也对应了相同的类(Class 对象)。因此不同对象也不能同时调用静态synchronized方法(同一对象更不行)

但是,由于两者使用不同的锁,所以即使是同一类的同一对象,也可以同时调用一个静态synchronized方法(在其他同类对象没有调用的前提下)和一个非静态synchronized方法

猜你喜欢

转载自blog.csdn.net/jlu16/article/details/80578189