java项目中同步代码的使用_JAVA高并发程序设计学习:Synchronized同步代码块具体使用方法...

多线程同时对资源进行访问时,同步机制使得同一时间内只能有一个线程对资源进行操作。

同步机制可以用Synchronized实现。

当Synchronized修饰一个方法的时候,该方法称为同步方法。

当Synchronized方法执行完成或者异常时会释放锁。

会有同学对synchronized修饰方法,静态方法,对象时具体对哪些东西加锁不是很明白,这里会进行详细的讲解。

synchronized修饰方法时,会对类实例进行加锁,该实例的所有synchronized方法必须等当前锁释放后才能访问。

synchronized修饰静态方法时,会对类对象上锁,改类的其他实例的的synchronized方法必须等当前锁释放后才能访问。

synchronized修饰对象时,会对对象上锁,其他使用该对象的synchronized方法必须等当前锁释放才能访问。

不使用synchronized修饰方法时

代码设计中一共使用到了三个类。

Example类是公共资源,会有多个线程访问。

本案例中有两个线程访问。

MyThread类是线程类,用于访问Example公共资源。

TestSynchronized是主类,用于new 线程并启动。

由于现在的Example类的方法没有使用同步方法,所以两个线程会同时访问该方法,打印的值也是无序的,如下:

fc0ee4fe0a98758261478f2ecc86849c.png

使用Synchronized修饰方法时

我们需要修改Example这个公共资源的方法。

对于exec方法加上synchronized关键字,该方法同时只能有一个线程访问。

00d1d538d08d83c6118d40986fa556a1.png

类中存在两个synchronized方法时

当类中存在多个synchronized方法时,线程访问synchronized方法时会对类的实例加锁,因此,该实例的其他synchronized方法在线程未结束之前无法访问。

我们对代码进行修改:

Example类增加一个同步方法。

增加一个线程类MyThread2,用于访问Example的exec2()方法。

主线程创建两个线程,并启动。

执行结果如下:

9e0da33df011093e66c5121dd81a3e93.png

synchronized修饰静态方法

synchronized修饰静态方法时,会对Class对象加锁。

对代码进行修改:

Example方法增加一个同步static方法

在主线程新建两个Example的实例

启动两个线程并执行

当其中一个实例的exec方法没有执行结束时,另外一个实例的任何synchronized都无法执行,因为修饰静态方法锁的是Class对象,而不是锁Class的实例。

运行结果如下:

synchronized修饰对象

synchronized修饰对象时锁住的是修饰的对象。

当一个线程执行时,将object对象锁住,另一个线程就不能执行对应的块。

我们需要设计一个例子:

类Example中需要有一个Object,需要两个同步方法,并且都是修饰该Object。

创建两个线程,同时访问这两个同步访问,看是否同步进行。

类Example代码:

Main方法中创建两个线程进行访问:

结果输出如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值