引入

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升级概述、偏向锁/轻量级锁详解 - 笔记相关推荐

  1. Java Synchronized 偏向锁/轻量级锁/重量级锁的演变过程

    前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...

  2. 【Java 并发编程】线程锁机制 ( 锁的四种状态 | 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 | 锁竞争 | 锁升级 )

    文章目录 一.悲观锁示例 ( ReentrantLock ) 二.重量级锁弊端 三.锁的四种状态 ( 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 ) 四.锁的四种状态之间的转换 ( 无锁状态 - ...

  3. 锁升级过程(偏向锁/轻量级锁/重量级锁)

    锁的前置知识 如果想要透彻的理解java锁的来龙去脉,需要先了解锁的基础知识:锁的类型.java线程阻塞的代价.Markword. 锁的类型 锁从宏观上分类,分为悲观锁与乐观锁. 乐观锁 乐观锁是一种 ...

  4. java中多线程之CAS(compareAndSet),Unsafe类大白话详解.

    java中多线程之CAS(compareAndSet),Unsafe类大白话详解 什么是CAS CAS原理 Unsafe类:     什么是CAS 比较并交换 在学习CAS之前,我们先了解一下JMM. ...

  5. 从 class 文件 看 synchronize 锁膨胀过程(偏向锁 轻量级锁 自旋锁 重量级锁)

    大家好,我是烤鸭: 前几天看马士兵老师的并发的课,里边讲到了 synchronize 锁的膨胀过程,今天想用代码演示一下. 1.  简单介绍 关于synchronize jdk 1.5 以后的优化,由 ...

  6. 可重入锁/不可重入锁,公平锁/非公平锁,乐观锁/悲观锁,独享锁/共享锁,偏向锁/轻量级锁/重量级锁,分段锁,自旋锁

    在并发编程中,会涉及到各种各样的锁,这篇文章主要介绍各种锁的分类以及作用. 介绍的内容如下: 可重入锁/不可重入锁 公平锁/非公平锁 乐观锁/悲观锁 独享锁/共享锁 偏向锁/轻量级锁/重量级锁 分段锁 ...

  7. 【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )

    文章目录 一.线程安全 二.锁机制 ( 类锁 | 对象锁 ) 三.锁分类 ( 轻量级锁 | 重量级锁 ) 一.线程安全 多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量 ...

  8. java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解

    首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取body内容(字符串/二进制)详解 获取HT ...

  9. java中String s=abc及String s=new String(abc)详解

    java中String s="abc"及String s=new String("abc")详解 1.   栈(stack)与堆(heap)都是Java用来在R ...

  10. 蓝桥杯java B组历年省赛真题汇总及题目详解

    蓝桥杯java B组历年省赛真题汇总及题目详解 2019年第十届蓝桥杯省赛真题详解 2018年第九届蓝桥杯省赛真题详解 2017年第八届蓝桥杯省赛真题详解 2016年第七届蓝桥杯省赛真题详解 2015 ...

最新文章

  1. window.open(url?param=+paramvalue) 服务端 乱码问题解决
  2. win 64位系统安装带有c编写的python模块出现ValueError: [u'path']解决
  3. [转]Membership 到 .NET4.5 之 ASP.NET Identity
  4. ***不是已知元素 原因可能是网站中存在编译错误
  5. 89C51单片机定时器控制的流水灯
  6. 图片效果集合(js、jquery或html5)
  7. 第二阶段团队冲刺(十)
  8. java暂停脚本_用Rhino解析Java中的JavaScript:暂停/恢复脚本
  9. python和c先学哪个-初学者python和c语言先学哪个好呢?
  10. c语言编译asn1文件,使用 asn1.c 开源编译工具生成 S1AP R15消息编解码C文件
  11. 腾讯云数据库智能化海量运维的建设与实践
  12. HenCoder Android开发进阶系列学习笔记
  13. win10下使用pycharm实现基于pyg的cora+citeseer+pubmed数据集的JKNET模型测试
  14. 敏捷 2016:行业分析研讨会
  15. QT(5.12)+Qgis(3.10) 点图层及线图层渲染
  16. 【机器学习】机器学习模型迭代方法(Python)
  17. 王立柱《c语言》3.5.5
  18. AR捡取纹理功能实现 colARmix涂涂乐
  19. java_程序题分析:将人名集合 ,{“Peter”,”Mary”,”Sam”,”Tom”,”Paker”,”Linda”,”Lina”} ,进行字典顺序排序(a~z的顺序)
  20. 锐捷交换机系统版本升级11.X平台

热门文章

  1. HDU - 4612 Warm up(边双缩点+树的直径)
  2. PAT (Basic Level) - 1025 反转链表(模拟)
  3. bootstrap 表格不用tr td如何写_Pandas还能用来写爬虫?
  4. 服务的默认端口_Informatica端口管理
  5. 调用 php_最全的PHP反序列化漏洞的理解和应用
  6. 最小公倍数和最大公约数
  7. C++设计模式之访问者模式
  8. 手把手教你玩转ARP包(一)
  9. 执行maven clean package 时报OutOfMemoryError的解决办法
  10. 混沌系列 | 其实制造“假死”很容易