Synchronized锁升级过程
Java SE 1.6 为了减少获得锁和释放锁带来的性能消耗,引入了 “偏向锁” 和 “轻量级锁”:锁一共有 4 种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。锁可以升级但不能降级。
偏向锁:大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步块并获取锁时,会在对象头和栈帧中记录存储锁偏向的线程ID,以后该线程在进入同步块时先判断对象头的Mark Word里是否存储着指向当前线程的偏向锁,如果存在就直接获取锁。(简单来说就是markword 记录这个线程ID (偏向锁))
自旋锁:当其他线程尝试竞争偏向锁时,锁升级为自旋锁。线程在执行同步块之前,JVM会先在当前线程的栈帧中创建用于存储锁记录的空间,并将对象头中的MarkWord替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,标识其他线程竞争锁,当前线程便尝试使用自旋来获取锁。(简单点来说就是线程如果争用偏向锁时,则升级为自旋锁)
重量级锁:锁在原地循环等待的时候,是会消耗CPU资源的。所以自旋必须要有一定的条件控制,否则如果一个线程执行同步代码块的时间很长,那么等待锁的线程会不断的循环反而会消耗CPU资源。默认情况下锁自旋的次数是10 次,可以使用-XX:PreBlockSpin参数来设置自旋锁等待的次数。10次后如果还没获取锁,则升级为重量级锁。(简单说:自旋锁自旋10次,升级为重量级锁)
tip:
markWord:存储了对象的hashCode、GC信息、锁信息三部分
Synchronized锁升级过程相关推荐
- synchronized锁升级过程及其实现原理
本文链接:https://blog.csdn.net/wangyy130/article/details/106495180 问:为什么会有锁升级的过程呢 答:在java6以前synchronized ...
- synchronized 锁升级过程
synchronized 锁升级过程就是其优化的核心:偏向锁 -> 轻量级锁 -> 重量级锁 class Test{private static final Object object = ...
- synchronized锁升级过程详解
32位: 64位: 无锁: 1001001110000101111101010101110 HashCode:1237514926 十进制:1237514926 二进制:0100100 1100001 ...
- Synchronized锁升级:无锁-> 偏向锁 -> 轻量级锁 -> 重量级锁
一. 概述 1. Synchronized锁升级的原因 用锁能够实现数据的安全性,但是会带来性能下降.无锁能够基于线程并行提升程序性能,但是会带来安全性下降. 2. Synchronized锁升级的过 ...
- 锁升级过程(无锁、偏向锁、轻量级锁、重量级锁)
文章目录 Synchronized锁升级的背景 Synchronized的性能变化 Java5之前,用户态和内核态之间的切换 为什么每个对象都可以称为一把锁? Java6开始优化Synchronize ...
- 存储过程没有执行完后没有释放锁_面试必问---synchronized实现原理及锁升级过程你懂吗?...
synchronized实现原理及锁升级过程 前言: synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差 ...
- 在c#中用mutex类实现线程的互斥_面试官经常问的synchronized实现原理和锁升级过程,你真的了解吗...
本篇文章主要从字节码和JVM底层来分析synchronized实现原理和锁升级过程,其中涉及到了简单认识字节码.对象内部结构以及ObjectMonitor等知识点. 阅读本文之前,如果大家对synch ...
- Synchronized详细介绍之锁升级过程
Synchronized详细介绍之锁升级过程 前言 线程与进程的区别 进程 线程 区别 协程 JVM线程调度原理 JVM线程调用过程 JAVA线程与内核线程的关系 源码分析 线程状态 Synchron ...
- 谈谈JVM内部锁升级过程
简介: 对象在内存中的内存布局是什么样的?如何描述synchronized和ReentrantLock的底层实现和重入的底层原理?为什么AQS底层是CAS+volatile?锁的四种状态和锁升级过程应 ...
最新文章
- 使用system语句出现不明确问题
- opencv3.4.1 vs2017 鼠标停在 Mat 上 vs卡死
- oracle rodo 查看大小,Checkpoint not complete故障
- python 获取子目录下的所有文件的路径
- 初次转化max模型为3D Tiles失败、cesium加载一个obj格式的3D 机房模型
- 计算机视觉与深度学习 | SLAM综述(自主移动机器人同时定位与地图创建)
- 豆瓣、唱吧、爱回收等106款应用被工信部下架
- spring session spring:session:sessions:expires 源码跟踪
- Struts,Spring 等开源项目svn 地址
- C# 程序中使用 SQLite 数据库
- 图像特征原理--HOG特征
- 局域网服务器ie浏览器文件传输慢,局域网内打开IE浏览器很久才显示主页,慢的原因及解决方法...
- 杭漂多年是时候画个句号呢
- uva 1645 count
- 2019年 十款Mac上必备的实用软件列表
- bzoj1720[Usaco2006 Jan]Corral the Cows 奶牛围栏
- ElasticSearch7.10配置Search-Guard之配置用户
- 推荐几本提高Java代码规范、可读性、健壮性和可维护性的基本经典图
- 软件跟踪调试破解心得
- 「构生态·建未来 」2019软件绿色联盟开发者大会售票开启
热门文章
- pika.exceptions.ChannelWrongStateError: Channel is closed.
- 【Unity面试】 Lua语言基础核心 | 面试真题 | 全面总结 | 建议收藏
- 如何用计算机求极限,计算机的极限与并行计算
- 07年钢材市场发展态势权威预测
- C语言计算字符串长度
- QSortFilterProxyModel实现排序、过滤
- Java程序员面试,基础真的很重要
- 手机无线遥控器,让手机变成无线鼠标+无线键盘!
- 蹭clubhouse热度加大IPO步伐,年轻的TT语音靠Z世代能掘金多少?
- 3ds Max小白入门小案例|FFD你是我的小苹果