[java多线程扫盲]---(1)线程同步--(1)synchronized关键字实现并发

Author:赵志乾
Date:2019-03-14
Declaration:All Right Reserved!!!

 

1、线程同步的简介

在某些场景下,同一进程内,会出现多个线程读写同一块内存、访问相同文件或者数据库连接。为了避免这些共享资源在被多个线程访问时出现数据不一致等错误,需要引入同步机制。

为了实现同步机制,引入了新概念:临界区。所谓的临界区其实就是用以访问共享资源的代码块集合,且在同一时刻,只能有一个线程的执行流处于临界区内。

注:此处的临界区定义属于严格意义上的临界区,后续我们会看到临界区包含的代码块集合可以划分为两大类:只读区和非只读区,进而引入一定的优化措施。

当一个线程试图访问一个临界区时,会使用某种同步机制查看是否已有其他线程执行流处于临界区。如果有,则被同步机制挂起,直到临界区内的线程执行流离开临界区,否则该线程执行流进入临界区。

2、synchronized关键字实现方法同步

synchronized关键字可用于实现两类方法级别的并发访问:实例方法和类方法。方式也比较简单:在方法签名中使用synchronized关键字即可。

a、实例方法并发访问

实例方法签名中使用synchronized关键字,则会将方法对应的代码块加入该实例对象负责的临界区。也就是说:实例方法签名使用synchronized关键字,就是开发人员显式向编译器传达“要使用该实例对象作为锁对象,并控制方法并发访问"这一信息。由于使用实例对象自身作为锁对象,所以不同的实例使用的锁对象是不同的,即同步机制仅存在于当前实例,而不存在于不同实例之间。

public synchronized void concurrentMethod(){
        // 逻辑代码
}

b、类方法并发访问

类方法签名汇总使用synchronized关键字,则会将方法对应的代码块加入该类的Class对象负责的临界区。也就是说:类方法签名使用synchronized关键字,就是开发人员显式向编译器传达“要使用该类的Class对象作为锁对象,并控制并发访问”这一信息。由于使用该类的Class对象作为锁对象,所以该类要并发的静态方法共用一把锁对象。

public synchronized static void concurrentMethod(){
        // 逻辑代码
}

注:synchronized关键字使用的锁对象是可重入的,即线程获的锁对象并在未释放之前可以再次获得该锁对象。这一特性主要是用于保证递归方法并发访问或临界区代码块的嵌套调用场景。

3、synchronized关键字实现代码块同步

synchronized关键字也可用于实现代码块级别的同步。方式也比较简单:使用synchronized关键字修饰代码块,并将锁对象作为传入参数,如下:

synchronized(锁对象){
    // 逻辑代码
}

注:使用synchronized关键字实现代码块同步时,必须要将锁对象显式传入。最常使用的场景是在实例方法中同步代码块,并将实例作为锁对象:

  synchronized(this){
        // 逻辑代码
  }

也可以使用其他对象作为锁对象,比如类中有多个非依赖属性,并且每个属性需要单独同步,此时可以使用属性对象作为锁对象,如下:

private final Object lock = new Object();
    
public void method(){
    // 逻辑代码
    synchronized (lock){
       // 同步代码块
    }
        
   // 逻辑代码  
}

4、总结

synchronized关键字可以看做是一种简化的重入锁机制,自行处理锁获取和锁释放。当其用于类方法时,使用类的Class对象作为锁对象;当其用于实例方法时,使用实例作为锁对象;而当其用于代码块时,必须显示指定传入锁对象。在使用synchronized关键字时,心中一定要区分出其使用的锁对象是谁,因为不同的锁对象负责的临界区是不同的。

 

参考资料:《java7并发编程实战手册》

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫白小猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值