Synchronized详解

4 篇文章 0 订阅
3 篇文章 0 订阅

Synchronized基本理解

synchronized关键字是为了解决并发编程中的线程安全问题而实现的关键字。

synchronized的思想就是给对象加上一个锁,这锁可以叫做对象锁,也可以叫排他锁。synchronized关键字有三种使用方式:

  1. 普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁
  2. 静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁
  3. 同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

synchronized关键字的特点

原子性

一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行

被synchronized修饰的类或对象的所有操作都是原子的,因为在执行操作之前必须先获得类或对象的锁,直到执行完才能释放,这中间的过程无法被中断(除了已经废弃的stop()方法),即保证了原子性。

可见性

可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的

synchronized对一个类或对象加锁时,一个线程如果要访问该类或对象必须先获得它的锁,而这个锁的状态对于其他任何线程都是可见的,并且在释放锁之前会将对变量的修改刷新到主存当中,保证资源变量的可见性,如果某个线程占用了该锁,其他线程就必须在锁池中等待锁的释放。

有序性

有序性值程序执行的顺序按照代码先后执行(Java允许编译器和处理器对指令进行重排,但是指令重排并不会影响单线程的顺序,它影响的是多线程并发执行的顺序性。)

synchronized保证了每个时刻都只有一个线程访问同步代码块,也就确定了线程执行同步代码块是分先后顺序的,保证了有序性。

可重入性

当一个线程试图操作一个由其他线程持有的对象锁的临界资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的临界资源时,这种情况属于重入锁。通俗一点讲就是说一个线程拥有了锁仍然还可以重复申请锁。

锁重入的意思就是当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁的。synchronized关键字拥有锁重入的功能,在一个synchronized方法/块内部调用本对象的其他synchronized方法/块时,是永远可以得到锁的,原因是Java中线程获得对象锁的操作是以线程为单位的,而不是以调用为单位的。同一个线程获得一个对象锁之后,再次访问这个对象的其他同步方法,所需的对象锁没有发生变化。

synchronized的底层实现

对象头

对象在内存中分为三个区域

对象头 实例数据 对齐填充

而对象头是实现synchronized关键子的基础。

synchronized使用的锁对象是存储在Java对象头里的,Hotspot虚拟机的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。其中Klass Point是是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例,Mark Word用于存储对象自身的运行时数据,它是实现轻量级锁和偏向锁的关键.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uoKasxDM-1601992308175)(C:\Users\yan\AppData\Roaming\Typora\typora-user-images\1601628298828.png)]

synchronized的不用用法在底层的实现也是不同的**

同步代码块实现原理

同步方法则是通过对象头实现的访问标志位为基础实现的。synchronized方法会被翻译成普通的方法调用和返回指令如:invokevirtual、areturn指令,在VM字节码层面并没有任何特别的指令来实现被synchronized修饰的方法,而是在Class文件的方法表中将该方法的access_flags字段中的synchronized标志位置1,表示该方法是同步方法并使用调用该方法的对象或该方法所属的Class在JVM的内部对象表示Klass做为锁对象。

同步方法实现原理

同步方法则是通过对象头实现的访问标志位为基础实现的。

synchronized修饰的方法并没有monitorenter指令和monitorexit指令,取得代之的确实是ACC_SYNCHRONIZED标识,该标识指明了该方法是一个同步方法,JVM通过该ACC_SYNCHRONIZED访问标志来辨别一个方法是否声明为同步方法,从而执行相应的同步调用。这便是synchronized锁在同步代码块和同步方法上实现的基本原理。

synchronized和ReentrantLock的区别

两者都是可重入锁

synchronized 依赖于 JVM 而 ReentrantLock 依赖于 API

ReentrantLock 比 synchronized 增加了一些高级功能

①等待可中断;②可实现公平锁;③可实现选择性通知(锁可以绑定多个条件)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值