【JavaEE】synchronized原理 -- 多线程篇(6)

news2024/11/16 5:22:39

synchronized原理

  • 1. synchronized具体采用了哪些加锁策略?
  • 2. synchronized内部实现策略(内部原理)
    • 2.1 偏向锁
    • 2.2 轻量级锁与重量级锁
  • 3. synchronized 的其它优化策略
    • 3.1 锁消除
    • 3.2 锁的粒度
  • 4. 总结

1. synchronized具体采用了哪些加锁策略?

  1. synchronized既是悲观锁, 也是乐观锁
  2. synchronized既是重量级锁, 也是轻量级锁
  3. synchronized重量锁部分是基于系统的互斥锁实现的; 轻量级锁部分是基于自旋锁实现的;
  4. synchronized是非公平锁 (不会遵守先来后到, 锁释放之后, 哪个线程拿到锁, 各凭本事)
  5. synchronized是可重入锁 (内部会记录哪个线程拿到了锁, 记录引用计数)
  6. synchronized不是读写锁

synchronized采取自适应的加锁策略!

2. synchronized内部实现策略(内部原理)

代码中写了一个 synchronized之后, 这里可能会产生一系列的"自适应的过程", 锁升级(锁膨胀);

在这里插入图片描述

2.1 偏向锁

  • 不是真正的加锁, 而只是做了一个 “标记”, 如果有别的线程来竞争锁了, 才会真正的加锁; 如果没有别的线程竞争, 就自始至终不会真的加锁了
  • 加锁本身, 有一定开销, 能不加, 就不加, 有人来竞争了, 才会真正的加锁~

2.2 轻量级锁与重量级锁

  • synchronized通过自旋锁的方式来实现轻量级锁
    • 我这边把锁给占了, 另一个线程就会按照自旋的方式, 来反复查询当前的状态是不是被释放了
  • 但是, 后续, 如果竞争这边锁的线程越来越多了(锁冲突更激烈了), 从轻量级锁 升级 成重量级锁
    • 轻量级锁: 这个锁操作都是比较消耗 CPU 的 如果能够比较快速的拿到锁, 多消耗点 CPU 也不亏
    • 但是随着竞争激烈, 即使前一个线程释放锁, 也不一定能拿到锁, 啥时候能拿到, 时间可能会比较久, 所以没必要一直占用CPU资源

3. synchronized 的其它优化策略

3.1 锁消除

  • 编译器, 会智能的判定, 当前这个代码, 是否有必要加锁
    • 如果你写了加锁, 但实际上没有必要加锁, 就会把加锁操作自动删除掉
  • 程序员也不能全指望考优化提高代码效率, 咱们自己也得发挥一些作用, 判断何时加锁, 也是咱们一个非常重要的工作

3.2 锁的粒度

概念

  • 加锁操作里面包含的实际要执行的代码越多, 就认为锁的粒度越大

在这里插入图片描述

  • 有时候, 希望锁的粒度小比较好, 并发程度高
  • 有时候, 也希望锁的粒度大比较好 – 因为加锁解锁本身也有开销

JVM 对锁的粒度的优化

在这里插入图片描述

  • 实际开发过程中, 使用细粒度锁, 是期望释放锁的时候其他线程能使用锁.
  • 但是实际上可能并没有其他线程来抢占这个锁. 这种情况 JVM 就会自动把锁粗化, 避免频繁申请释放锁.

4. 总结

可以看到, synchronized 的策略是比价复杂的, 在背后做了很多事情, 目的为了让程序猿哪怕啥都不懂, 也不至于写出特别慢的程序.

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1119304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Power BI 傻瓜入门 4. Power BI:亮点

本章内容包含: 在Power BI Desktop上学习诀窍摄入数据使用模型试用Power BI服务 就像评估一个由多种成分组成的蛋糕一样,Power BI要求其用户熟悉商业智能(BI)解决方案中的功能。几乎所有与Power BI交互的用户都是从桌面版开始的…

Locust负载测试工具实操

本中介绍如何使用Locust为开发的服务/网站执行负载测试。 Locust 是一个开源负载测试工具,可以通过 Python 代码构造来定义用户行为,避免混乱的 UI 和臃肿的 XML 配置。 步骤 设置Locust。 在简单的 HTTP 服务上模拟基本负载测试。 准备条件 Python…

2021年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下列代码的输出结果是?( ) x 0x10print(x)A:2 B:8 C&#xff…

NeurIPS 23 Spotlight丨3D-LLM:将3D世界注入大语言模型

来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://arxiv.org/pdf/2307.12981.pdf 开源代码:https://vis-www.cs.umass.edu/3dllm/ 摘要: 大型语言模型 (LLM) 和视觉语言模型 (VLM) 已被证明在多项任务上…

FPGA的256点FFT调用Quartus IP核实现VHDL傅里叶变换

名称:256点FFT调用Quartus IP核实现傅里叶变换 软件:Quartus 语言:VHDL 代码功能:使用VHDL实现256点FFT,调用Quartus IP核实现傅里叶变换 演示视频:http://www.hdlcode.com/index.php?mhome&cView…

Mysql基础与高级汇总

SQL语言分类 DDL:定义 DML:操作 DCL:控制(用于定义访问权限和安全级别) DQL:查询 Sql方言 ->sql:结构化查询语言 mysql:limit oracle:rownum sqlserver:top 但是存储过程:每一种数据库软件一样SQL语法要求: SQL语句可以单行或多行书写&…

msvcp110.dll无法继续执行代码怎么办?msvcp110.dll丢失的解决方法

msvcp110.dll 丢失通常意味着你的计算机上缺少一个名为 msvcp110.dll 的动态链接库文件。这个文件是 Microsoft Visual C 2010 Redistributable Package 的一个组件,它包含了一些运行时库文件。当你的计算机缺少这个文件时,可能会出现一些问题&#xff0…

有哪些靠谱的获客渠道? 大家都在说精准大数据获客,你了解过没?

如何获取准确、实际的客户信息是众多企业在获客阶段最头疼的问题,想要精准获客就需要了解客户的真实需求,若企业无法满足又无法预估到客户意向,那么将会浪费双方的时间,费力不讨好,企业获客难题是这么多年最难以解决的…

接口自动化测试难点:数据库验证解决方案

接口自动化中的数据库验证:确保数据的一致性和准确性 接口自动化测试是现代软件开发中不可或缺的一环,而数据库验证则是确保接口返回数据与数据库中的数据一致性的重要步骤。本文将介绍接口自动化中的数据库验证的原理、步骤以及示例代码,帮…

关于Mysql中的索引与事务

索引 定义 索引:为了提高查找效率而使用的一种数据结构把数据组织起来,可以把索引理解在书的目录或字典的检索表(拼音检索) 索引是一种特殊的文件,可以包含着对数据表里的所有记录的引用指针,对表中的一…

jQuery实现输入框提示并点击回显功能呢

html代码: <input type"text" id"affOrganization" name"affOrganization" class"form-control" placeholder"Search..." style"width: 300px" > <div class"search_suggest" id"gov_se…

模拟退火算法(SA)求解旅行商问题(TSP)python

目录 一、模拟退火算法求解TSP&#xff08;city14&#xff09;的python代码 二、city14的运行结果 三、 模拟退火算法求解TSP&#xff08;city30&#xff09;的python代码 四、city30的运行结果 一、模拟退火算法求解TSP&#xff08;city14&#xff09;的python代码 impor…

中文编程开发语言工具构件说明:屏幕截取构件的编程操作

屏幕截取 用于截取指定区域的图像。 图 标&#xff1a; 构件类型&#xff1a;不可视 重要属性 l 截取类型 枚举型&#xff0c;设置在截取屏幕时的截取类型。包括&#xff1a;全屏幕、指定区域、活动窗口三种。当全屏幕截取时相当于执行了硬拷屏&#xff08;PrintScre…

优化Scrum敏捷需求管理流程,敏捷需求如何管理。

​优化敏捷需求管理流程的方法可以参照如下&#xff1a; 明确需求 。在项目开始时&#xff0c;要确保清楚地理解客户需求&#xff0c;明确项目的目标和范围&#xff0c;以便能够在敏捷迭代中快速响应需求变更。 使用用户故事 。采用用户故事的方式&#xff0c;让客户和开发团…

虚拟化、容器与Docker基本介绍以及安装部署(Docker 基本管理)

目录 1 Docker 概述 1.1 Docker与虚拟机的区别 1.2 容器在内核中支持2种重要技术 1.3 Docker核心概念 2 安装 Docker 2 Docker 镜像操作 2.1 搜索镜像 2.2 获取镜像 2.3 镜像加速下载 2.4 查看镜像信息 2.4.1 查看下载的镜像文件信息 2.4.2 查看下载到本地的所有镜像…

【STL】bitset的模拟实现

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C进阶 ⭐代码仓库&#xff1a;C进阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

HTML5有哪些新特性?移除了哪些元素?

HTML5引入了许多新特性&#xff0c;以下是其中一些主要的新特性&#xff1a; 1&#xff1a;语义化元素&#xff1a;HTML5引入了一些新的语义化元素&#xff0c;如 <header>、<footer>、<nav>、<article>、<section>等&#xff0c;使得页面结构…

计算机组成原理 new09 定点数的移位运算

文章目录 原码/正数反码/正数补码的算术移位负数反码的算术移位负数补码的算术移位算术移位总结符号扩展算术移位的应用真值的算术移位逻辑移位逻辑移位的运用 循环移位不带进位位的循环移位(小循环)带进位位的循环移位(大循环)原码定点一位乘法原码定点一位乘法(手算) (这里我…

【Qt控件之QToolBox】介绍及使用

概述 QToolBox类提供了一个列式的带有选项卡的小部件条目。工具箱是一个小部件&#xff0c;以一个列式的选项卡显示在上方&#xff0c;并在当前选项卡下方显示当前的小部件条目。每个选项卡在选项卡列中有一个索引位置。选项卡的小部件条目是一个QWidget。 每个小部件条目都有…

婚纱摄影行业,还在使用电梯广告?不如试试大数据精准营销

以武汉为例&#xff0c;婚纱摄影的以薇拉&#xff0c;青禾&#xff0c;韩国艺匠&#xff0c;果石&#xff0c;等品牌为主&#xff0c;竞争尤其惨烈&#xff0c;婚纱摄像婚庆行业主要依赖于线下推广&#xff08;如依靠与酒店、婚礼策划等上下游产业合作&#xff09;&#xff0c;…