synchronized

 

每个对象只有一把监视锁(monitor lock),对于同步块,synchornized获取的是参数中的对象锁:

synchornized(obj){

  //...............

}

线程执行到这里时,首先要获取obj这个实例的锁,如果没有获取到线程只能等待.如果多个线程执行到这里,只能有一个线程获取obj的锁,然后执行{}中的语句,所以,obj对象的作用范围不同,控制程序不同.假如:

public void test(){

  Object o = new Object();

  synchornized(obj){

  //...............

  } }

对于这段程序,多个线程之间执行到Object o = new Object();会各自产生一个对象然后获取这个对象有监视锁,各自皆大欢喜地执行.而如果是类的属性:

class Test{

    Object o = new Object();

    public void test(){

    synchornized(o){

    //...............

    }    }

}

所有执行到Test实例的synchornized(o)的线程,只有一个线程可以获取到监视锁.有时我们会这样:

public void test(){

    synchornized(this){

    //...............

    }  }

那么所有执行Test实例的线程只能有一个线程执行.synchornized(o)synchornized(this)的范围是不同的,因为执行到Test实例的synchornized(o)的线程等待时,其它线程可以执行Test实例的synchornized(o1)部分,但多个线程同时只有一个可以执行Test实例的synchornized(this).而对于

synchornized(Test.class){

    //...............

}

这样的同步块而言,所有调用Test多个实例的线程只能有一个线程可以执行.

[synchornized方法]

如果一个方法声明为synchornized,则等同于在此方法上调用synchornized(this).如果一个静态方法被声明为synchornized,则等同于在此方法上调用synchornized(.class).

如果一个类有两个synchronized方法,是不是同一时间只能有一个处于运行,这个两个方法的锁是一样的吗?答:它们的锁是this对象,如果是对不同的对象调用方法,起不到锁的作用.这儿有一个前提是加在了非静态方法上,如果是静态方法上则锁得是类对象,那么同一时间只能有一个处于运行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值