synchronized实现原理及锁升级过程

前言:

synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的

尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchronized已经变得原来越强大了,本文带大家了解的是synchronized实现原理及锁升级过程,希望可以帮助到大家。

1.用法

synchronized可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。

synchronized有三种应用方式:

作用于实例方法,当前实例加锁,进入同步代码前要获得当前实例的锁;

作用于静态方法,当前类加锁,进去同步代码前要获得当前类对象的锁;

作用于代码块,对括号里配置的对象加锁。

2.实现原理

2.1 Java对象头

synchronized用的锁存在Java对象头里,Java对象头里的Mark Word默认存储对象的HashCode、分代年龄和锁标记位。在运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化。32位JVM的Mark Word可能变化存储为以下5种数据:

锁一共有四种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态随着竞争情况逐渐升级。为了提高获得锁和释放锁的效率,锁可以升级但不能降级,意味着偏向锁升级为轻量级锁后不能降级为偏向锁。

1.偏向锁

当一个线程访问同步块并获取锁时,会在对象头和栈帧的锁记录里存储偏向的线程ID,以后该线程在进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需测试Mark Word里线程ID是否为当前线程。如果测试成功,表示线程已经获得了锁。如果测试失败,则需要判断偏向锁的标识。如果标识被设置为0(表示当前是无锁状态),则使用CAS竞争锁;如果标识设置成1(表示当前是偏向锁状态),则尝试使用CAS将对象头的偏向锁指向当前线程,触发偏向锁的撤销。偏向锁只有在竞争出现才会释放锁。当其他线程尝试竞争偏向锁时,程序到达全局安全点后(没有正在执行的代码),它会查看Java对象头中记录的线程是否存活,如果没有存活,那么锁对象被重置为无锁状态,其它线程可以竞争将其设置为偏向锁;如果存活,那么立刻查找该线程的栈帧信息,如果还是需要继续持有这个锁对象,那么暂停当前线程,撤销偏向锁,升级为轻量级锁,如果线程1不再使用该锁对象,那么将锁对象状态设为无锁状态,重新偏向新的线程。

2.轻量级锁

线程在执行同步块之前,JVM会先在当前线程的栈帧中创建用于存储锁记录的空间,并将对象头的MarkWord复制到锁记录中,即Displaced Mark Word。然后线程会尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁。如果失败,表示其他线程在竞争锁,当前线程使用自旋来获取锁。当自旋次数达到一定次数时,锁就会升级为重量级锁。

轻量级锁解锁时,会使用CAS操作将Displaced Mark Word替换回到对象头,如果成功,表示没有竞争发生。如果失败,表示当前锁存在竞争,锁已经被升级为重量级锁,则会释放锁并唤醒等待的线程。

流程大致如下:

结束:

今天就分享到这里,有不对需要改进的地方还望大佬们指出

我在学习过程中整理了一些学习资料,可以分享给做java的工程师朋友们,相互交流学习,需要的可以私信(资料)即可免费获取Java架构学习资料

其中覆盖了互联网的方方面面,期间碰到各种产品各种场景下的各种问题,很值得大家借鉴和学习,扩展自己的技术广度和知识面。

最后记得帮作者点个关注哦

存储过程没有执行完后没有释放锁_面试必问---synchronized实现原理及锁升级过程你懂吗?...相关推荐

  1. 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...

    PS:本文已收录到1.3 K+ Star 数的开源项目-<大厂面试指北>,如果想要了解更多,可以看一看,项目地址如下: https://github.com/NotFound9/inter ...

  2. 为什么不用mysql版本号加锁_面试必问的Mysql事务和锁,你真的了解吗?

    前言 本文内容 事务的定义和作用,隔离级别 MVCC 是什么,快照读和加锁读 锁分类,行锁,意向锁,怎么查看 Mysql 锁的信息 悲观锁和乐观锁的使用场景 Mysql 的版本为 8.0.17. 事务 ...

  3. notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象

    notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象 public class Test3 {public static void main(String[] ...

  4. 理解c函数执行完后,释放内存

    在C语言中,函数仅仅是一个小的功能块,函数执行完后(也就是函数功能完成),会根据调用约定来释放,该执行函数所占用的内存资源.这里的资源就是执行该函数所占用的栈内存.当函数执行完后仅仅就是释放该函数所用 ...

  5. 看完946页“JAVA高级架构面试必问”,金九银十社招全拿下

    前言 我本科毕业后在老东家干了两年多,老东家算是一家"小公司"(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找坑的时 ...

  6. mysql什么隔离级别最好_面试必问的 Mysql 四种隔离级别,看完吊打面试官

    什么是事务 事务是应用程序中一系列严密的操做,全部操做必须成功完成,不然在每一个操做中所做的全部更改都会被撤消.也就是事务具备原子性,一个事务中的一系列的操做要么所有成功,要么一个都不作.sql 事务 ...

  7. Java并发:明白Synchronized实现原理,锁什么?

    最近看到synchronized的知识点,做些简单记录. 一.Synchronized的基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法.Synchr ...

  8. 线程执行完之后会释放吗_java多线程并发:CAS+AQS+HashMap+volatile+ThreadLocal,乐分享...

    CyclicBarrier.CountDownLatch.Semaphore 的用法 CountDownLatch(线程计数器 ) CountDownLatch 类位于 java.util.concu ...

  9. vue在一个方法执行完后执行另一个方法

    vue在一个方法执行完后执行另一个方法 用Promise来实现. Promise是ES6的新特性,用于处理异步操作逻辑,用过给Promise添加then和catch函数,处理成功和失败的情况 ES7中 ...

最新文章

  1. 每日一皮:项目开发停在了最后10%的效果...
  2. python有相关的证书可以考吗-python后端开发工程师考证试题
  3. 国家卫健委:我国男女性成人平均身高分别为169.7厘米和158厘米
  4. 全球及中国凝胶植入物市场专项调研与供需现状分析报告2022年
  5. .net ListT
  6. python和java学哪个好-学python还是java python和java哪个好入门
  7. 北大生物信息学公开课学习(1)
  8. 10.Configure One-to-Many(配置一对多关系)【Code-First系列】
  9. autocad ios 虚线_教大家AutoCAD2020怎么画虚线的方法
  10. 奥克兰大学 计算机硕士 GPA,申请奥克兰大学需要GPA成绩吗
  11. 大数据基础篇~JavaSE第一章
  12. 西班牙首相被中国新零售圈粉!天猫总裁靖捷透露了一个“合伙人计划”
  13. 【Kernel】驱动开发学习之Platform平台总线模型
  14. 解决OneNote 无法粘贴图像 的问题
  15. 2023基于微信小程序的校园第二课堂活动报名系统+后台管理系统(Springboot+mysql)-JAVA.VUE(论文+开题报告+运行)
  16. 万字长文带你 搞定 linux BT 宝塔面板 之外网上快速搭建苹果CMS电影网站
  17. python 床前明月光_Python之利用Whoosh搭建轻量级搜索
  18. 使用MATLAB绘制分段函数实现
  19. 【小程序项目开发-- 京东商城】uni-app开发之分包配置
  20. 数字嗅觉将气味模拟系统带入21世纪(Digital Olfaction Brings Scent Systems Into the 21st Century)

热门文章

  1. mvc框架异常处理机制
  2. 高级数据库,建库,建表,建约束
  3. 修改无效_解决docker部署gitlab时,clone地址无效和修改默认端口
  4. android webview 图表,Android WebView 无法正常显示网页图表
  5. idea_取消自动import .*
  6. sql的case when用法
  7. $compile 手动编译
  8. Linux中通过Socket文件描述符寻找连接状态介绍
  9. 每天学点Linux命令:倒叙打印文件第二行的前100个大写字母
  10. c# 相对路径的一些文献