多线程 JAVA synchronized 的三中用法实例 深度解读

synchronized(this)、synchronized(class)与synchronized(Object)的区别

在多线程开发中,我们经常看到synchronized(this)、synchronized(*.class)与synchronized(任意对象)这几种类型同步方法。但是是否知道这几种写法有什么区别了?下面根据代码来分析:

DEMO1.synchronized代码块间的同步性:

以下为建立的实例代码:

模拟一个工具类:提供吃水果服务

 

从上面的运行结果可以得出:当一个线程访问EatFruitService的的一个同步(synchronized(this))的代码块时,其他线程对同一个EatFruitService的其他的同步(synchronized(this))的代码块的访问是阻塞的,这说明synchronized(this)使用的对象监视器是同一个。

DEMO2.验证synchronized (this)代码块是锁定当前对象

 

 

可以看到吃苹果的动作并没有如向计划的那样进行执行,而是直接进行了异步执行,

下面在在方法eatApple()上加上同步synchronized

DEMO3.验证synchronized (this)代码块是锁定当前对象2

 

 

根据上面的三个例子可以知道,多个线程调用同一个对象的不同名称的synchronized同步方法,或synchronized(this)同步代码块时,是同步的。

1、synchronized同步方法

①对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;

②同一时间只有一个线程执行synchronized同步方法中的代码。

2、synchronized(this)同步代码块

①对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;

②同一时间只有一个线程执行synchronized同步方法中的代码。

 

DEMO4.将任意对象作为对象监视器

当我们把锁对象加在方法内,而不是作为对象的成员属性,如下图:

DEMO4.将任意对象作为对象监视器2

运行结果如下:

根据以上运行结果,对比验证得知:多个线程持有的监视器对象是同一个对象的前提下,

同一时间只允许一个线程执行synchronized同步代码块。其中synchronized(lock)中的lock对象可以是任意自定义对象。

 

DEMO5.synchronized(任意自定义对象)与synchronized同步方法共用

 

根据以上运行结果可知:

使用synchronized(任意自定义对象)进行同步操作,对象监视器必须是同一个对象。如果不是同一个,运行就是异步执行了。

现在考一下大家,如果将本上面本演示中第一张图lock改成this,运行后是同步吗??

答案是肯定的。

 

DEMO6.静态同步synchronized方法与synchronized(*.class)代码块

静态同步synchronized方法

Synchronized对静态方法持锁,是对当前的class进行持锁,是同步的,即便对象不同。

 

DEMO6.静态同步synchronized方法与synchronized(*.class)代码块2

 

synchronized(*.class)代码块

 

 

DEMO6.静态同步synchronized方法与synchronized(*.class)代码块3

上面测试方法是共同对象,下面我们分别实例化一个对象:

结论:

同步synchronized(*.class)代码块的作用其实和synchronized static方法作用一样。Class锁对类的所有对象实例起作用。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值