【Java】什么是CAS、synchronized升级概述、偏向锁/轻量级锁详解 - 笔记
引入
CAS
lock cmpxchg
在硬件层面实现:在操作过程中不允许被其他CPU打断,避免CAS在写数据的时候被其他线程打断,相比操作系统级别的锁,效率要高很多。
加锁才能让多线程的访问变为序列化。
用户态和内核态
对于操作系统来说,普通程序希望操作硬件,需要进行申请。所有指令可以直接被操作系统内核直接访问,而用户进程想要访问硬件资源,需要通过操作系统才能访问。
内核态:执行在内核空间,能够访问所有指令
用户态:只能访问用户能够访问的指令
linux内核工作在ring0,用户进程工作在ring3
syncronized的升级:不同于早期,有时候只需要在用户态进行操作,不需要经过内核态。
int 0x80
向OS申请一个中断的调用
markword
工具:JOL=Java Object Layout,添加 Maven 依赖:
对象的内存布局:当new出一个对象之后,这个对象在内存是怎么分布的?
我们来看HotSpot的实现。
要求对象8字节对齐(对象大小字节数必须是8的整数倍,如果不是,补4个空字节)
8字节markword
4字节classpointer(默认)
4字节instance data(用于存储成员变量)
…关于类方法,方法放在虚方法表里,那是另外一个实现了。
那么,synchronized
做了什么事?
结论:锁信息被记录在了markword里面
JDK8 markword实现表:
锁升级初步
轻量级锁也叫自旋锁
偏向锁
前提:
StringBuffer是同步的
多数代码段在实际运行时只有一个线程,所以没有必要设计竞争机制。
偏向锁
没有必要设计锁竞争机制时,只是把第一个访问的线程的id
写到markword
中,而不去真正的加锁
自旋锁
偏向锁时,有人来竞争锁了,现在操作系统把偏向锁撤销,进行自旋锁(轻量级锁)竞争。
竞争方式:每个人在自己的线程内部生成一个自己LR(Lock Record锁记录),两个线程通过自己的方式尝试将 LR 写门上,竞争成功的开始运行,竞争失败的一直自旋等待。
重量级锁
当必须加锁时,markword中记录的是objectmonitor(JVM用C++写的一个Object)
class文件的字节码
monitorenter(sync开始时)
monitorexit(sync完成或发生异常)
锁重入
synchronized是可重入锁(在未解锁的情况下,可以多次被加锁)。
用来满足子类和父类都是sync的情况。
重入次数必须记录,因为要解锁几次必须要对应。
偏向锁实现:记录在线程栈里,自旋锁->线程栈->每重入一次,LockRecord+=1
重量锁实现:惊动了操作系统,记录在ObjectMonitor字段上
轻量级锁什么时候升级为重量级锁
什么是偏向锁启动/未启动
为什么有自旋锁,还需要有重量级锁?
自旋是占用CPU时间,消耗CPU资源的。如果锁的时间长或者自旋线程多,CPU资源会被大量消耗。这是不划算的。在这种情况下,升级为重量级锁。重量级锁中有等待队列,拿不到锁的进入等待队列,不需要消耗CPU资源(比如竞争队列、执行队列、等待队列waitset)
偏向锁是否一定比自旋锁效率高?
不一定。在明确知道一个资源会有多线程竞争的情况下,偏向锁肯定会涉及锁撤销。这时候应给直接使用自旋锁。
JVM启动过程,会有很多线程竞争(明确知道),所以默认情况,JVM启动时不打开偏向锁(默认时延4秒)。一段时间之后再打开。可以使用Thread.sleep(5000);
之后再new对象验证
普通对象 怎么直接到 偏向锁?
批量重偏向与批量锁撤销
【Java】什么是CAS、synchronized升级概述、偏向锁/轻量级锁详解 - 笔记相关推荐
- Java Synchronized 偏向锁/轻量级锁/重量级锁的演变过程
前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...
- 【Java 并发编程】线程锁机制 ( 锁的四种状态 | 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 | 锁竞争 | 锁升级 )
文章目录 一.悲观锁示例 ( ReentrantLock ) 二.重量级锁弊端 三.锁的四种状态 ( 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 ) 四.锁的四种状态之间的转换 ( 无锁状态 - ...
- 锁升级过程(偏向锁/轻量级锁/重量级锁)
锁的前置知识 如果想要透彻的理解java锁的来龙去脉,需要先了解锁的基础知识:锁的类型.java线程阻塞的代价.Markword. 锁的类型 锁从宏观上分类,分为悲观锁与乐观锁. 乐观锁 乐观锁是一种 ...
- java中多线程之CAS(compareAndSet),Unsafe类大白话详解.
java中多线程之CAS(compareAndSet),Unsafe类大白话详解 什么是CAS CAS原理 Unsafe类: 什么是CAS 比较并交换 在学习CAS之前,我们先了解一下JMM. ...
- 从 class 文件 看 synchronize 锁膨胀过程(偏向锁 轻量级锁 自旋锁 重量级锁)
大家好,我是烤鸭: 前几天看马士兵老师的并发的课,里边讲到了 synchronize 锁的膨胀过程,今天想用代码演示一下. 1. 简单介绍 关于synchronize jdk 1.5 以后的优化,由 ...
- 可重入锁/不可重入锁,公平锁/非公平锁,乐观锁/悲观锁,独享锁/共享锁,偏向锁/轻量级锁/重量级锁,分段锁,自旋锁
在并发编程中,会涉及到各种各样的锁,这篇文章主要介绍各种锁的分类以及作用. 介绍的内容如下: 可重入锁/不可重入锁 公平锁/非公平锁 乐观锁/悲观锁 独享锁/共享锁 偏向锁/轻量级锁/重量级锁 分段锁 ...
- 【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )
文章目录 一.线程安全 二.锁机制 ( 类锁 | 对象锁 ) 三.锁分类 ( 轻量级锁 | 重量级锁 ) 一.线程安全 多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量 ...
- java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解
首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取body内容(字符串/二进制)详解 获取HT ...
- java中String s=abc及String s=new String(abc)详解
java中String s="abc"及String s=new String("abc")详解 1. 栈(stack)与堆(heap)都是Java用来在R ...
- 蓝桥杯java B组历年省赛真题汇总及题目详解
蓝桥杯java B组历年省赛真题汇总及题目详解 2019年第十届蓝桥杯省赛真题详解 2018年第九届蓝桥杯省赛真题详解 2017年第八届蓝桥杯省赛真题详解 2016年第七届蓝桥杯省赛真题详解 2015 ...
最新文章
- window.open(url?param=+paramvalue) 服务端 乱码问题解决
- win 64位系统安装带有c编写的python模块出现ValueError: [u'path']解决
- [转]Membership 到 .NET4.5 之 ASP.NET Identity
- ***不是已知元素 原因可能是网站中存在编译错误
- 89C51单片机定时器控制的流水灯
- 图片效果集合(js、jquery或html5)
- 第二阶段团队冲刺(十)
- java暂停脚本_用Rhino解析Java中的JavaScript:暂停/恢复脚本
- python和c先学哪个-初学者python和c语言先学哪个好呢?
- c语言编译asn1文件,使用 asn1.c 开源编译工具生成 S1AP R15消息编解码C文件
- 腾讯云数据库智能化海量运维的建设与实践
- HenCoder Android开发进阶系列学习笔记
- win10下使用pycharm实现基于pyg的cora+citeseer+pubmed数据集的JKNET模型测试
- 敏捷 2016:行业分析研讨会
- QT(5.12)+Qgis(3.10) 点图层及线图层渲染
- 【机器学习】机器学习模型迭代方法(Python)
- 王立柱《c语言》3.5.5
- AR捡取纹理功能实现 colARmix涂涂乐
- java_程序题分析:将人名集合 ,{“Peter”,”Mary”,”Sam”,”Tom”,”Paker”,”Linda”,”Lina”} ,进行字典顺序排序(a~z的顺序)
- 锐捷交换机系统版本升级11.X平台
热门文章
- HDU - 4612 Warm up(边双缩点+树的直径)
- PAT (Basic Level) - 1025 反转链表(模拟)
- bootstrap 表格不用tr td如何写_Pandas还能用来写爬虫?
- 服务的默认端口_Informatica端口管理
- 调用 php_最全的PHP反序列化漏洞的理解和应用
- 最小公倍数和最大公约数
- C++设计模式之访问者模式
- 手把手教你玩转ARP包(一)
- 执行maven clean package 时报OutOfMemoryError的解决办法
- 混沌系列 | 其实制造“假死”很容易