iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java synchronized轻量级锁实现过程浅析
  • 388
分享到

Java synchronized轻量级锁实现过程浅析

Javasynchronized轻量级锁Java synchronizedJava轻量级锁 2023-02-11 18:02:30 388人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、什么是轻量级锁二、为什么引入轻量级锁三、轻量级锁的升级时机四、轻量级锁的演示五、轻量级锁的原理六、轻量级锁升级为重量级锁的流程七、轻量级锁的优缺点一、什么是轻量级锁 轻量级锁

一、什么是轻量级锁

轻量级锁是jdk 6之中加入的新型锁机制,它名字中的“轻量级”是相对于使用monitor的传统锁而言的。轻量级锁指的是存在多线程竞争,但是任意时刻最多只允许一个线程竞争获得锁,即不存在锁竞争太过激烈的情况,轻量级锁情况下,线程不会发生阻塞。

二、为什么引入轻量级锁

轻量级锁考虑的是竞争锁对象的线程不多,而且线程持有锁的时间也不长的场景。因为阻塞线程需要CPU从用户态转到内核态,代价比较大,如果刚刚阻塞不久这个锁就被释放了,那这个代价就有点得不偿失了,因此这个时候就干脆不阻塞这个线程,让它自旋这等待锁的释放。

三、轻量级锁的升级时机

主要有两个:

1)、关闭偏向锁功能

使用 -XX:-UseBiasedLocking参数关闭偏向锁,此时默认进入轻量级锁;

2)、多个线程竞争偏向锁

偏向锁状态下,由于别的线程尝试竞争偏向锁,并且CAS更新MarkWord中线程ID失败,此时发生【偏向锁 -> 轻量级锁】升级;

举个例子:

1、线程A先获取到锁对象,线程B又过来尝试竞争这个锁,此时该锁已是偏向锁偏向线程A了;

2、线程B尝试执行CAS去替换锁对象MarkWord中线程ID,看下能不能获取到锁;

3、如果线程B的CAS成功了,说明此时线程A执行完了同步块代码,这个时候线程B会直接替换锁对象MarkWord中线程ID为自己的线程ID,该锁不会发生升级,还是处于偏向锁状态;

4、如果线程B的CAS失败了,说明线程A还没执行完同步块代码,这个时候,偏向锁就会升级为轻量级锁(偏向锁标识置为0,同步锁标识置为00),这个轻量级锁由原来持有偏向锁的线程A持有,继续执行同步代码,此时正在竞争的线程B会进入CAS自旋等待获取这个轻量级锁;

四、轻量级锁的演示

前面我们了解到,当关闭偏向锁功能的时候,默认获取的是轻量级锁。所以我们这里添加运行时参数 -XX:-UseBiasedLocking参数禁用偏向锁。

public class LightweightLockDemo01 {
    public static void main(String[] args) {
        // 关闭偏向锁,默认进入轻量级锁
        Object objLock = new Object();
        new Thread(() -> {
            synchronized (objLock) {
                System.out.println(ClassLayout.parseInstance(objLock).toPrintable());
            }
        }, "t1").start();
    }
}

可以看到,对象头最后三位为“000”,表示当前获取的是一把轻量级锁。

五、轻量级锁的原理

轻量级锁的加锁

1)、JVM会在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝(官方称为Displaced Mark Word)。若一个线程获得锁时发现是轻量级锁,它会将对象的Mark Word复制到栈帧中的锁记录Lock Record中(Displaced Mark Word里面);

2)、线程尝试利用CAS操作将对象的Mark Word更新为指向Lock Record的指针,如果成功表示当前线程竞争到锁,则将锁标志位变成00,执行同步操作;

3)、如果失败,表示MarkWord已经被替换成了其他线程的锁记录,说明在与其他线程抢占竞争锁,当前线程就尝试使用自旋来获取锁;

注意,JVM采用的是自适应自旋,也就是说,自适应意味着自旋的次数不是固定不变的,JVM会根据同一个锁上一次自旋的时间以及拥有锁线程的状态来决定到底需要自旋多少次。JVM针对那些很少会自旋成功的线程,那么下次会减少自旋的次数甚至压根不自旋,避免CPU空转。

轻量级锁的释放

轻量级锁的释放也是通过CAS操作来进行的,当前线程使用CAS操作将Displaced Mark Word的内存复制回锁对象的MarkWord中,如果CAS操作替换成功,则说明释放锁成功;如果CAS自旋多次还是替换失败的话,说明有其他线程尝试获取该锁,则需要将轻量级锁膨胀升级为重量级锁;

六、轻量级锁升级为重量级锁的流程

七、轻量级锁的优缺点

优点

在多线程交替执行同步块的情况下,可以避免重量级锁引起的性能消耗;

缺点

如果长时间自旋后还没竞争到锁,将会过度耗费CPU,即CPU空转;

到此这篇关于Java synchronized轻量级锁实现过程浅析的文章就介绍到这了,更多相关Java synchronized 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java synchronized轻量级锁实现过程浅析

本文链接: https://www.lsjlt.com/news/195683.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java synchronized轻量级锁实现过程浅析
    目录一、什么是轻量级锁二、为什么引入轻量级锁三、轻量级锁的升级时机四、轻量级锁的演示五、轻量级锁的原理六、轻量级锁升级为重量级锁的流程七、轻量级锁的优缺点一、什么是轻量级锁 轻量级锁...
    99+
    2023-02-11
    Java synchronized轻量级锁 Java synchronized Java轻量级锁
  • Java synchronized轻量级锁如何实现
    这篇“Java synchronized轻量级锁如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java&n...
    99+
    2023-07-05
  • Javasynchronized重量级锁实现过程浅析
    目录一、什么是重量级锁二、重量级锁的演示三、重量级锁的原理四、锁的优缺点对比一、什么是重量级锁 当有大量的线程都在竞争同一把锁的时候,这个时候加的锁,就是重量级锁。 这个重量级锁...
    99+
    2023-02-11
    Java synchronized重量级锁 Java synchronized Java重量级锁
  • Java synchronized重量级锁如何实现
    今天小编给大家分享一下Java synchronized重量级锁如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-05
  • java中synchronized锁的升级过程
    目录synchronized锁的升级(偏向锁、轻量级锁及重量级锁)java同步锁前置知识点synchronized同步锁java对象头偏向锁轻量级锁重量级锁关于自旋锁打印偏向锁的参数...
    99+
    2024-04-02
  • Java中synchronized锁升级的过程
    目录简介CASmarkWordSynchronized的锁升级偏向锁轻量级锁重量级锁总结简介 在多线程中解决线程安全的问题时常用到Synchronized,现在的synchroniz...
    99+
    2024-04-02
  • 深入了解Java Synchronized锁升级过程
    目录前言对象结构对象头(1)无锁(2)偏向锁(3)轻量级锁(4)重量级锁对象体对齐字节锁升级补充:Synchronized底层原理EOF前言 首先,synchronized 是什么?...
    99+
    2024-04-02
  • Java中synchronized轻量级锁的核心原理是什么
    这篇文章将为大家详细讲解有关Java中synchronized轻量级锁的核心原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 轻量级锁的原理引入轻量级锁的主要目的是在多线程竞争不激烈的情况下,...
    99+
    2023-06-29
  • java多线程Synchronized实现可见性原理解析
    Synchronized实现可见性原理 可见性 要实现共享变量的可见性,必须保证两点: 线程修改后的共享变量值能够及时从工作内存刷新到主内存中 其他线程能够及时把共...
    99+
    2024-04-02
  • 如何浅析LINQ嵌套的实现过程
    这篇文章将为大家详细讲解有关如何浅析LINQ嵌套的实现过程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。LINQ嵌套的操作是什么呢?LINQ嵌套需要注意什么呢?LINQ嵌套使用的是什么方法呢...
    99+
    2023-06-17
  • 怎么实现JAVA 多线程的浅析
    这期内容当中小编将会给大家带来有关怎么实现JAVA 多线程的浅析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JAVA 的多线程浅析一、JAVA 语言的来源、及特点在这个高速信息的时代,商家们纷纷把信息、...
    99+
    2023-06-03
  • JS轻量级函数式编程实现XDM二
    目录前言偏函数传参现状封装 partial运行机制拓展 partial柯里化阶段小结前言 承接上一篇《XDM,JS如何函数式编程?看这就够了!(一)》,我们知道了函数式编程的几个基本...
    99+
    2024-04-02
  • JS轻量级函数式编程实现XDM一
    前言 盲猜一个:如果你有看过 《medium 五万赞好文-《我永远不懂 JS 闭包》》 《“类”设计模式和“原型”设计模式&mdash...
    99+
    2024-04-02
  • JS轻量级函数式编程实现XDM三
    目录前言组合函数含义封装盒子任意组合compose 变体抽象能力阶段小结前言 这是【JS如何函数式编程】系列文章第三篇。点赞关注,持续追踪 前两篇传送门: 《XDM,JS如何函数式编...
    99+
    2024-04-02
  • Vue组件渲染与更新实现过程浅析
    目录1. 模板编译2. 组件渲染和更新1. 模板编译 Vue的模板编译就是将模板字符串转换为渲染函数的过程。具体来说,当组件的生命周期执行到created和beforeMounted...
    99+
    2023-03-03
    Vue组件渲染 Vue组件更新
  • Springboot整合ActiveMQ实现消息队列的过程浅析
    目录pom中导入坐标书写yml配置业务层代码监听器代码业务层代码确保你启动了自己电脑的activemq。 pom中导入坐标 <dependency> ...
    99+
    2023-02-10
    Springboot整合ActiveMQ Springboot ActiveMQ消息队列
  • 怎么理解用Java实现的超轻量级RESTful Web服务
    本篇内容主要讲解“怎么理解用Java实现的超轻量级RESTful Web服务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解用Java实现的超轻量级RESTful Web服务”吧!Web ...
    99+
    2023-06-16
  • Java线程优先级变量及功能实例分析
    这篇文章主要介绍“Java线程优先级变量及功能实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程优先级变量及功能实例分析”文章能帮助大家解决问题。前言:线程被称为“最小的处理单元”,...
    99+
    2023-07-02
  • Java实现Android拼图游戏设计过程解析
    目录1.项目介绍2.项目原理3.项目设计4.项目实现5.获取布局6.准备图片7.初始化 item8.游戏图片的切换9.游戏胜利的判断10.游戏封面1.项目介绍 这是一款基于 Java...
    99+
    2024-04-02
  • java多线程批量拆分List导入数据库的实现过程
    目录一、前言二、直接把list怼进Mysql三、分组把list导入Mysql中四、多线程分批导入Mysql五、小结一、前言 前两天做了一个导入的功能,导入开始的时候非常慢,导入2w...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作