并发编程(2)synchronized原理及其优化

一. synchronized介绍及其原理

1.synchronized介绍

Synchronized可以保证一个共享资源在同一时间只被一个线程访问到。可以通过同步方法或同步代码块的方式实现同步。

同步方法的常量池会有一个ACC_SYNCHRONIZED标志,当某个线程要访问某个方法时,会检查是否有ACC_SYNCHRONIZE,如果有则需要先获得监视器锁,方法执行完后再释放监视器锁

同步代码块使用monitorenter和moniterexit两个指令实现,可以把monitoreenter理解为枷锁,monitorexit理解为解锁。每个对象维护着一个被锁次数的计数器。执行monitorenter后计数器值加1,执行monitorexit后计数器值减1.计数器值为0时锁被释放,其它线程便可以获得锁。

clipboard.png

2.对监视器monitor的理解

对象的锁,即monitor。是在重量级锁状态下,MarkWord里的指针指向的对象

clipboard.png

二:markword

1.对象的组成

(1)对象头:包含①markword:存储自身运行时的数据,如hash码,gc分代年龄,锁状态标志等②类型指针:用来确定这个对象是属于哪个类的实例

(2)实例数据:对象真正存储的有效信息

(3)对齐填充:jvm要求对象大小必须是8字节的整数倍,对象头一定是满足,但实例数据不满足的话要对齐填充。

2.markword

markword数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit,它的最后2bit是锁状态标志位,用来标记当前对象的状态,对象的所处的状态,决定了markword存储的内容

 

32位虚拟机在不同状态下markword结构如下图所示:

这里写图片描述

 

三. synchronized的优化

jdk1.6引入了偏向锁和轻量级锁

锁一共有4种状态:无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态。锁可以升级但不能降级

1.轻量级锁

如果没有实际的锁竞争,那么申请重量级锁是浪费性能的。加锁过程:(1)jvm在当前线程的栈帧中创建用于存储锁记录的空间(2)将对象头中的mark word复制到锁记录中(3)尝试使用cas将对象头中的mark word替换为指向锁记录的指针,成功则获得锁。失败尝试使用自旋操作来获取锁

2.偏向锁:是对轻量级锁的一种优化。它适用于没有竞争且只有一个线程使用锁的情况。(轻量级锁每次申请都需要一次cas,偏向锁只初始化需要一次)偏向锁对象第一次被线程访问时使用CAS把这个线程id记录在对象的mark word中,同时是否偏向锁标志位置1,以后该线程进入和退出同步块时不需要进行加锁和解锁,只需要简单的测试一下对象的mark word中是否存储着该线程id

3.自旋操作:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。

 

四. synchronized的执行过程: 


1. 检测Mark Word里面是不是当前线程的ID,如果是,表示当前线程处于偏向锁 
2. 如果不是,则使用CAS将当前线程的ID替换Mard Word,如果成功则表示当前线程获得偏向锁,置偏向标志位1 
3. 如果失败,则说明发生竞争,撤销偏向锁,进而升级为轻量级锁。 
4. 当前线程使用CAS将对象头的Mark Word替换为锁记录指针,如果成功,当前线程获得锁 
5. 如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。 
6. 如果自旋成功则依然处于轻量级状态。 
7. 如果自旋失败,则升级为重量级锁。

上面几种锁都是JVM自己内部实现,当我们执行synchronized同步块的时候jvm会根据启用的锁和当前线程的争用情况,决定如何执行同步操作;

 

五.cas

compare and swap(比较与交换),是一种有名的无锁算法。就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步。涉及到三个操作数:内存值,期望值,新值。只有期望值和内存中的值相等时才会将内存中的值更新为新值。否则不会执行任何操作。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值