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方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值