锁策略、原子编程CAS 和 synchronized 优化过程

news2025/3/16 2:03:01

前言

锁冲突:两个线程获取一把锁,一个线程阻塞等待,一个线程加锁成功。

目录

前言

一、锁策略

(一)乐观锁和悲观锁

(二)重量级锁和轻量级锁

(三)自旋锁和挂起等待锁

(四)读写锁

(五)公平锁和非公平锁

(六)可重入锁和不可重入锁

二、原子编程CAS

(一)实现原子类

(二)实现自旋锁

(三)CAS的ABA问题

三、synchronized 优化过程

结语


一、锁策略

(一)乐观锁和悲观锁

根据加锁之前对锁冲突概率的预测,预定工作的多少!

乐观锁:预测该场景中,不太出现锁冲突的情况,后续做的工作更少。

悲观锁:预测该场景中,非常容易出现锁冲突的情况,后续做的工作更多。

synchronized初始使用乐观锁策略,当发现锁竞争比较频繁时,就会自动切换成悲观锁策略。

(二)重量级锁和轻量级锁

加锁之后,考虑实际的锁的开销。

重量级锁:加锁的开销越大,花的时间越多,占用系统资源多。

轻量级锁:加锁的开销越小,花的时间越少,占用系统资源少。

synchronized开始是一个轻量级锁,如果锁冲突比较严重,就会变成重量级锁。

(三)自旋锁和挂起等待锁

自旋锁:轻量级锁的一种典型实现。在用户态下,通过自旋的方式(while循环),实现类似于加锁的效果,消耗一定的CPU资源,但可最快速度拿到锁。

挂起等待锁:重量级锁的一种典型实现。通过内核态,借助系统提供的锁机制,当出现锁冲突时,会牵扯到内核对于线程的调度,使冲突的线程出现挂起(阻塞等待),消耗的CPU资源少,但无法保证第一时间拿到锁。

synchronized中的轻量级锁策略大概是通过自旋锁实现的;

synchronized中的重量级锁策略大概是基于系统的互斥锁实现的。

(四)读写锁

将读操作和写操作分开了。如图:

synchronized不是读写锁。

(五)公平锁和非公平锁

公平锁:遵循先来后到的道理。

非公平锁:看起来概率相等,实际不公平(每个线程的阻塞时间不一样)。

synchronized是非公平锁。

(六)可重入锁和不可重入锁

可重入锁:如果一个线程争对一把锁连续加锁两次,不会出现死锁的情况。

不可重入锁:如果一个线程争对一把锁连续加锁两次,会出现死锁的情况。

synchronized是可重入锁。

二、原子编程CAS

CAS本质上是一种无锁编程,将某个寄存器中的值和内存中的值进行比较,如果相等则进行交换

(一)实现原子类

可以使用 自增/自减/自增任意值/自减任意值 实现计数、统计这类场景中。

常用的有:AtomicInteger、AtomicLong

加锁保证线程安全是通过锁避免出现穿插;但是CAS保证线程安全是借助CAS识别当前是否出现穿插的情况,如果没有穿插就是安全的,穿插了就重新读取内存的最新值,再次尝试修改。

(二)实现自旋锁

获取当前线程的引用,判断其是否进行了加锁。加锁了就自旋等待,没有加锁就将内置变量owner设为当前尝试加锁的线程。

(三)CAS的ABA问题

CAS是根据判断内存和寄存器中的值是否相等来进行判断其是否发生改变。但是如果这两者都发生了从A变成B,又从B变成了A的情况,那我们的CAS就会判断错误,从而导致A再次发生变化。

为了解决这类ABA问题,就引入了版本号,判断版本号是否相等即可

数据每修改一次,版本号就增加一次,故此原先的A和后来的A的版本号不同,判断结果也就会判断他们不同,不会使其发生改变。

三、synchronized 优化过程

synchronized不是一开始就是对我们的代码块处于进行加锁的状态。synchronized的改变是一个自适应的过程: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁。

偏向锁:不是真的加锁,而只是做了一个标记。如果有别的线程来竞争锁了,就会真的加锁如果没有其他线程竞争锁,就会始终都不会真的加锁

synchronized还有一些其他的优化操作

锁消除:编译器会自动的判断你当前的代码是否有必要加锁。如果你写了锁,但实际上没必要加锁就会把锁自动删掉。

锁粗化:关于“锁的粒度”。如果加锁操作里包含的实际执行语句多,就认为锁的粒度越大。


结语

这篇博客如果对你有帮助,给博主一个免费的点赞以示鼓励,欢迎各位🔎点赞👍评论收藏⭐,谢谢!!!

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

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

相关文章

HTML基础1

一、创建项目和标签基础 1.1 什么是HTML 英文全称Hyper Text Markup Language, 中文全称为超文本标记语言。 超文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部…

进程与线程(概念、并行、并发)

进程与线程 一、定位二、什么是进程?三、进程管理1、PCB相关属性(了解)2、多任务的处理方式 四、什么是线程?总结 一、定位 在计算机系统中,操作系统是其中的重要一环。对上,给软件提供稳定的运行环境&…

ssm+vue线上体验馆管理系统源码和论文

ssmvue线上体验馆管理系统源码和论文085 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储&#xff0…

el-collapse折叠面板默认全部展开/关闭

所要展开项的name标识符与v-model绑定值匹配即可默认展开。 1. 案例 <el-collapse v-model"activeNames"><el-collapse-item name"0" title段落1>那一年&#xff0c;花开得不是最好&#xff0c;可是还好&#xff0c;我遇到你&#xff1b;&l…

高忆管理:A股已具备年度配置价值

周末利好四箭齐发&#xff0c;财政部、证监会、三大买卖所均宣布严重方针调整&#xff0c;首要包含印花税调降、IPO节奏阶段性收紧、融资保证金比例降至80%、限制大股东和实控人减持等。二级商场上&#xff0c;大盘大幅高开后一路震动走低&#xff0c;终究收盘涨幅显着收窄。业…

ROS通信机制之服务(Service)的应用

1、服务的概述 在上节我们讲过一个重要通信机制话题&#xff1a;ROS通信机制之话题(Topics)的发布与订阅以及自定义消息的实现&#xff0c;这里介绍另外一种节点之间传递数据的方法&#xff1a;服务(Service)服务的本质是同步的跨进程函数调用&#xff0c;也就是说节点可以调用…

骨传导耳机哪款比较好,市面上最好的骨传导耳机分享

随着科技的日新月异&#xff0c;骨传导耳机也在不断更新换代。市场上涌现出许多品牌&#xff0c;这使得消费者在购买时感到困惑。别担心&#xff01;我们为你整理了一些市场上最好的骨传导耳机品牌&#xff0c;希望能帮到你。现在&#xff0c;就让我们一起探索这些骨传导耳机的…

人工智能会成为人类的威胁吗?马斯克、扎克伯格、比尔·盖茨出席

根据消息人士透露&#xff0c;此次人工智能洞察论坛将是一次历史性的聚会&#xff0c;吸引了来自科技界的许多重量级人物。与会者们将共同探讨人工智能在科技行业和社会发展中的巨大潜力以及可能带来的挑战。 埃隆马斯克&#xff0c;特斯拉和SpaceX的首席执行官&#xff0c;一直…

ssm+vue理发店会员管理系统源码和论文

ssmvue理发店会员管理系统源码和论文089 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&a…

《高性能Linux网络编程核心技术揭秘》已出版

#好书推荐##好书奇遇季#《高性能Linux网络编程核心技术揭秘》&#xff0c;京东当当天猫都有发售。定价109元&#xff0c;网店打折销售更便宜。本书配套示例项目源码、作者QQ答疑。 本书详解高性能Linux网络编程的核心技术及DPDK框架&#xff0c;剖析Nginx高性能服务器架构&…

《PyTorch 2.0深度学习从零开始学》已出版

#好书推荐##好书奇遇季#《PyTorch 2.0深度学习从零开始学》&#xff0c;京东当当天猫都有发售。定价69元&#xff0c;网店打折销售更便宜。本书配套示例项目源码、PPT课件。 本书以通俗易懂的方式介绍PyTorch深度学习基础理论&#xff0c;并以项目实战的形式详细介绍PyTorch框…

无涯教程-Android - 应用组件

应用程序组件是Android应用程序的基本组成部分&#xff0c;这些组件需要在应用程序清单文件 AndroidManifest.xml 注册&#xff0c;该文件描述了应用程序的每个组件以及它们如何交互。 Android应用程序可以使用以下四个主要组件- Sr.NoComponents & 描述1 Activities 它们…

基于JAVA SpringBoot和HTML婴幼儿商品商城设计

摘要 随着网络技术的发展与普遍,人们的生活发生了日新月异的变化,特别是计算机的应用已经普及到经济和社会的各个领域.为了让消费者网上购物过程变得简单,方便,安全,快捷,网上商城购物成了一种新型而热门的购物方式。网上商城在商品销售的发展中占据了重要的地位,已成为商家展示…

Python直接变快五倍?最新的优化解释器和内存管理

来自公众号&#xff1a;OSC开源社区 2020 年秋&#xff0c;CPython 核心开发者 Mark Shannon 提出了关于 Python 的几个性能改进&#xff0c;这个提议被称为 “香农计划” (Shannon Plan)。 Shannon 随后创建了 Faster Cpython 项目&#xff0c;他希望在 4 年的时间里&#xff…

Boost开发指南-4.11config

config config库主要是提供给Boost库开发者&#xff08;而不是库用户&#xff09;使用&#xff0c;它将程序的编译配置分解为三个正交的部分&#xff1a;平台、编译器和标准库&#xff0c;帮助他们解决特定平台特定编译器的兼容问题。 一般来说&#xff0c;config库不应该被库…

《Flink学习笔记》——第二章 Flink的安装和启动、以及应用开发和提交

​ 介绍Flink的安装、启动以及如何进行Flink程序的开发&#xff0c;如何运行部署Flink程序等 2.1 Flink的安装和启动 本地安装指的是单机模式 0、前期准备 java8或者java11&#xff08;官方推荐11&#xff09;下载Flink安装包 https://flink.apache.org/zh/downloads/hadoop&a…

循环购商业模式:挖掘用户价值,创新引领商业未来-微三云门门

亲爱的企业家们&#xff0c;我是微三云门门&#xff01;今天&#xff0c;我将为大家详细介绍一种颠覆性的商业模式&#xff1a;循环购商业模式。这个模式不仅可以帮助企业提升平台的复购率&#xff0c;还能够拉新用户并提升用户的消费率。让我们一起深入了解这个引人注目的商业…

MySQL8.Xx安装控制台未参数随机密码解决方案

MySQL8.xx一主两从复制安装与配置 MySQL8.XX随未生成随机密码解决方案 一: Mysql 安装时控制台未生成密码 安装过程中解压或者时安装时报错等,这种情况一般是因网络等其他原因导致下载的安装包不完整&#xff0c; 重新下载安装即可; 二: 安装解压都没问题,就是不生成随机密…

软件测试用例经典方法 | 单元测试法案例

单元测试又称模块测试&#xff0c;是对软件设计的最小单元的功能、性能、接口和设计约束等的正确性进行检验&#xff0c;检查程序在语法、格式和逻辑上的错误&#xff0c;并验证程序是否符合规范&#xff0c;以发现单元内部可能存在的各种缺陷。 单元测试的对象是软件设计的最…

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 内容简介 作者简介 使用Python做一个计算器 本期赠书 近年来国家大力支持半导体行业&#xff0…