java并发同步,锁升级过程

java并发同步,锁升级过程

为避免多线程并发执行,访问并更新共享资源造成数据混乱,在java中使用同步机制来控制共享资源在同一时刻只被一个线程操作影响,而锁是同步机制的具体实现。java关键字
synchronized 是锁的具体实现,通过在对象头中加入锁标识来控制并发。在synchronized的设计过程中经历过一次升级,原有的实现基于操作系统内核命令来控制并发,由于在
运行过程中需要频繁在用户态和内核态之间转换,并且某些业务场景下并不是时时刻刻都存在大量并发,于是升级过后,synchronized关键字实现的锁,并不是一开始就使用系统内核控制,
而是会判断线程竞争的激烈程度来进行锁的升级,以下便是锁升级过程中的几种锁。

什么是偏向锁

偏向锁是锁升级过程中最轻量的"锁",通常情况下,同步代码块只有一个线程在执行,这个时候,通过偏向锁来标识此线程正在执行同步代码,当再次运行到同步代码块判断时(也许是新的线程请求执行同步代码块,
也许是原来的获得偏向锁的线程再次运行,即锁重入),这时如果判断是获得偏向锁的线程再次重入,那么将放行此线程(偏向于这个线程,即偏向锁),如果判断是新的线程,那么如果恰巧原来的获得偏向锁的线程还在执行,那么就需要进行
锁升级了(有线程竞争了,需要升级了)

什么是轻量级锁

轻量级锁,仍然认为同步代码块的锁竞争并不激烈,于是通过CAS算法来控制。CAS compare and swap 是乐观锁的一种实现方式,定义一个标识变量,在进入代码块之前获得这个变量的初值,在同步代码块执行结束后,判断标识变量与期望值是否一致,
如果一致,则认为在同步代码运行过程中没有其他线程的干扰,如果与期望的不一致,认为是存在并发执行,将重复执行一遍同步代码及标识变量的判断过程,直到与期望值一致。可以看到,轻量级锁完全可以由用户态代码进行控制而不需要系统内核函数的参与,
避免了锁竞争过程中用户态与内核态的切换,于是叫它轻量级锁。synchronized 轻量级锁通过CAS控制锁对象(即同步监视器)对象头的标识,来判断是否获得了同步代码块的执行权(即是否加锁成功)。
轻量级锁适用于一定程度的锁竞争的情况,而在大量锁竞争的场景下,CAS将会使大量没有获得执行权限的线程进行循环判断(自旋)的情况,使cpu的压力增大,于是当自旋达到一定次数未获取到锁的时候,
轻量级锁将会升级为重量级锁。

什么是重量级锁

重量级锁,将使用操作系统指令(monitorenter、monitorexit)来控制多线程的并发,线程调度交由操作系统来进行调度,涉及内核态到用户态的相互转换,是最保险也是开销最大的一种锁状态

哪些叫锁,但不是真正的锁

JUC包中AQS相关的并发工具类,例如ReentrantLock可重入锁、CountDownLatch 等。利用state标志+双向队列的数据结构,以及CAS操作来实现锁的获取和释放

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hongmin.shm

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

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

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

打赏作者

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

抵扣说明:

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

余额充值