java锁介绍

news2024/11/24 10:44:30

乐观锁

乐观地认为并发访问不会造成数据冲突,只在更新时检查是否有冲突。乐观锁和CAS的关系可以用“乐观锁是一种思想,CAS是一种具体的实现”来理解。

当使用CAS操作修改数据时,如果版本号不匹配或者其他线程已经修改了要操作的数据,CAS会返回失败。这时候,程序可以再次尝试CAS操作,也就是进行自旋重试,直到CAS操作成功。

因此,CAS操作已经内置了自旋重试的机制,避免了使用额外的自旋锁。

适用场景:适用于并发较低(高并发场景每次修改了去对比,还不如让加锁阻塞排队执行)、读多写少的场景,相信数据多数情况下不会发生冲突,只在更新时进行检查,以减少对共享资源的争用。

java中常见悲观锁实现:可以使用java.util.concurrent.atomic包中的原子类,比如AtomicInteger、AtomicLong等,来实现CAS操作。

mysql实现乐观锁:版本号、时间戳

悲观锁

悲观地认为并发访问会造成数据冲突,因此在访问共享资源之前就会进行加锁,确保同一时刻只有一个线程能够访问。

适用场景:适用于高并发写多的场景,通过加锁保护共享资源,确保并发访问时不会造成数据不一致性。

java中常见悲观锁实现:synchronized 关键字、ReentrantLock(可重入锁)

mysql中实现悲观锁:SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE

乐观锁ABA问题

ABA问题是在并发编程中一种常见的问题,特别是在使用乐观锁的情况下。它的发生主要是因为在执行CAS操作(比较并交换)时,数据的值发生了变化。

具体来说,假设有两个线程 T1 和 T2,初始时它们都读取了某个共享变量的数值为 A。然后 T1 首先将共享变量的值从 A 修改为了 B,然后再将其修改回 A,而线程 T2 在 T1 修改回 A 之前也对共享变量进行了修改(比如将 A 修改为了 C,然后再修改回 A)。在这种情况下,线程 T2 会错误地认为共享变量的值没有发生变化,因为它原始读取的值和最终值都是 A。这就是ABA问题的本质。

乐观锁通常使用CAS操作来实现,而CAS操作的基本思想是:读取当前内存值 A,比较 A 和预期值 B 是否相等,如果相等,则更新为新值 C;否则进行重试。在ABA问题中,CAS操作可能会由于共享变量的值从 A 变化为 B 再变化为 A,导致CAS操作在比较时误以为共享变量的值没有发生变化。

为了解决ABA问题,一种常见的方法是使用版本号(Version Numbering)或者时间戳(Timestamp)来标记共享变量的变化次数,每次修改共享变量时都更新版本号或时间戳,这样就能够避免因为共享变量的数值相同而导致的误判。另外,Java中的AtomicStampedReference类可以用于解决ABA问题,它通过引入一个标记来区分不同的修改次数,从而避免了传统CAS操作可能出现的ABA问题。

悲观锁 和 乐观锁 比较

相对而言,悲观锁适用于高并发,乐观锁适用于低并发
为什么乐观锁适用于并发量低:因为并发量高的时候,cas一直失败自旋没有任何意义,损耗性能,不如让cpu干其他的或者等待

锁升级

在 Java 中,锁升级是指在同步代码块中锁的状态发生改变的过程。这个过程包括偏向锁、轻量级锁和重量级锁三种状态的切换。
锁升级是JVM自动进行管理的。当JVM检测到多个线程对同步代码块的竞争时,会根据实际情况自动进行锁的升级。这种锁升级的机制是为了在多线程竞争情况下保证程序的安全和效率,以及在不同线程竞争程度下选择合适的锁状态,从而最大限度地提高并发性能。

偏向锁:

用于处理只有一个线程访问同步块的情况,减少不必要的竞争。
偏向锁需要在对象头中记录持有偏向锁的线程ID,避免重复的CAS操作。
适用于只有一个线程执行同步块的情况,从而减少不必要的同步操作。不用去加锁释放锁。

轻量级锁:

适用于短时间内只有少量线程竞争同步块的情况。
使用CAS操作尝试获取锁,避免了传统锁(互斥锁)的性能开销。
在少量线程竞争情况下,避免了传统锁的重量级化,提高了性能。

重量级锁:

当锁存在大量的线程竞争时会升级为重量级锁,采用传统的互斥锁实现。
保证了线程间数据同步和互斥访问,但性能开销相对较大。

偏向锁升级为轻量级锁:
当多个线程访问同步块时,偏向锁会升级为轻量级锁。这时,会使用CAS(Compare And Swap)操作来尝试获取锁,如果成功获取锁,则表示处于轻量级锁状态。

轻量级锁升级为重量级锁:
如果轻量级锁获取失败,就会升级为重量级锁。这时,会使用传统的互斥锁机制来确保线程间的互斥访问。

公平锁

公平锁则按照请求锁的顺序来获取锁,不允许插队,即等待时间最长的线程会优先获得锁。

非公平锁

非公平锁允许抢占,即允许在等待队列中的线程随机获取锁,synchronized 关键字是非公平锁

在 Java 中,ReentrantLock 是可重入锁的一种实现,通过使用 ReentrantLock 类,可以根据构造函数的不同参数选择是公平锁还是非公平锁。例如:

ReentrantLock fairLock = new ReentrantLock(true); // 创建一个公平锁
ReentrantLock unfairLock = new ReentrantLock(false); // 创建一个非公平锁

共享锁(Shared Lock):

允许多个事务同时获取对象的共享锁,可同时读取共享资源,但不允许进行修改。这种锁适用于读多写少的场景,可以提高并发读取的效率。

排他锁(Exclusive Lock):

排他锁是一种独占锁,它防止其他事务获取同一对象的共享或排他锁,确保只有一个事务能够对资源进行修改操作,其他事务需要等待该锁的释放。

可重入锁:

可重入锁是一种允许同一个线程多次获取同一把锁的锁。当线程第一次获取锁后,再次尝试获取该锁时,也会成功获取而不会被阻塞,这样可以避免死锁情况的发生。Java 中的 ReentrantLock 、synchronized 就是一种可重入锁的实现。
在这里插入图片描述

不可重入锁:

不可重入锁是一种不允许同一个线程多次获取同一把锁的锁。如果一个线程已经获取了该锁,再次尝试获取时会被阻塞,即使是同一个线程也不能再次获取这把锁,这可能会导致死锁情况。
在这里插入图片描述

单机锁:

单机锁是指在单个计算机或单个进程中控制对共享资源的访问的锁。常见的单机锁包括 synchronized 关键字、ReentrantLock 等。单机锁通常只在单个 JVM 内有效,不能跨越多个计算机或进程。 synchronized 关键字或 ReentrantLock 都是单机锁

分布式锁:

分布式锁是用于在分布式系统中控制对共享资源的访问的锁,可以跨越多个计算机或进程。分布式锁可以通过基于数据库、基于缓存(如 Redis)、基于 ZooKeeper 等方式来实现。

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

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

相关文章

AI讲师人工智能讲师大模型培训讲师叶梓:突破大型语言模型推理效率的创新方法

大型语言模型(LLM)在自然语言处理(NLP)任务中展现出了前所未有的能力,但它们对计算资源的巨大需求限制了其在资源受限环境中的应用。SparQ Attention算法提出了一种创新的方法,通过减少注意力机制中的内存带…

混合app开发

安卓与h5交互 原生调用js js调用原生 ios与h5交互 代码演示 ios调用h5 xcode创建一个ios项目 h5调用原生 h5部分代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conten…

二分法问题

日升时奋斗&#xff0c;日落时自省 目录 1、二分法 2、二分法问题 2.1 、在排序数组中查找元素的第一个和最后一个位置 2.2、搜索插入位置 2.3、山脉数组的峰顶索引 2.4、0-n-1中缺失的数字 1、二分法 二分法是比较简单的一种查找算法&#xff0c;但是效率很高&#xff0…

掌握Node Version Manager(nvm):跨平台Node.js版本管理

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

瀑布流组件(vue2)

文档连接&#xff1a;clz 加载状态、行数 可以自行控制&#xff0c;目前只支持vue2 实现效果&#xff1a;

【TDSQL】TCPMSS最大数据分段大小值不合理导致JAVA程序连接数据库异常案例

欢迎关注“数据库运维之道”公众号&#xff0c;一起学习数据库技术! TDSQL核心架构原理解析下载链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;vat5 DTC2024 数据技术嘉年华&#xff08;演讲资料下载&#xff09;DTC2024 数据技术嘉年华&#xff08;演讲资料下载…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(5)——可控评估端到端评估

最后完结篇,文末有测试中发现的有趣现象,并附上了相关资料链接~ 5.可控评估 分两个阶段评估生成代理。我们从一个更加严格控制的评估开始,单独评估代理的响应,以了解它们是否在狭义上定义的上下文中产生可信的行为。然后,在我们对代理社区进行为期两天的端到端分析中,我…

决策树分类器(保姆级教学) 定义+特性+原理及公式+鸢尾花分类经典问题示例(完整Python代码带详细注释、保姆级分部代码解释及结果说明、决策树可视化及解释)

文章目录 引言定义特性基本原理和公式理解信息增益&#xff08;ID3算法&#xff09;熵的定义条件熵信息增益的计算 基尼不纯度&#xff08;CART算法&#xff09;基尼不纯度的定义基尼不纯度的计算例子 实现步骤解决鸢尾花分类问题&#xff08;机器学习入门中的经典案例Python代…

传感器融合 | 适用于自动驾驶场景的激光雷达传感器融合项目_将激光雷达的高分辨率成像+测量物体速度的能力相结合

项目应用场景 面向自动驾驶场景的激光雷达传感器融合&#xff0c;将激光雷达的高分辨率成像测量物体速度的能力相结合&#xff0c;项目是一个从多个传感器获取数据并将其组合起来的过程&#xff0c;可以更加好地进行环境感知。项目支持 ubuntu、mac 和 windows 平台。 项目效果…

在系统中设定延迟任务和定时任务

useradd easylee //设置名为easylee的新用户 passwd easylee //更改密码为easylee&#xff0c;输入两次即可 将root和easylee加入白名单&#xff0c;使系统中只有root用户和easylee用户可以执行延迟任务的设置。 建立任务并给权限 定时任务

vue 实现实时搜索文档关键字并高亮显示

最近接到的一个新需求&#xff1a;实时搜索文档关键字并高亮显示&#xff0c;听起来好难的样子&#xff0c;仔细分析起来其实也蛮简单的。 实现思路 通过 input 实现关键字的输入&#xff0c;监听关键字的变化&#xff0c;用正则表达式来匹配关键字&#xff0c;然后给关键字添…

视觉信息保真度VIF算法详细介绍

来源 算法核心思想来源该篇论文A VISUAL INFORMATION FIDELITY APPROACH TO VIDEO QUALITY ASSESSMENT;是2005年的一篇高引用文章; 是一种全参考的视频图像评价算法;在奈飞开源的视频质量评价工具vmaf中将其作为一个判断维度,具体关于vmaf介绍可以参考视频质量评价工具vmaf…

一文学会时序约束

主时钟约束命令/生成时钟约束命令IO输入输出延迟约束命令及效果最大最小延迟命令及作用多周期路径怎么约束什么情况设置伪路径时钟组设置的三个选项 如果不了解时序分析可以先看下下面这篇文章&#xff1a; 数字IC/FPGA——时序分析 目录 1.时钟约束&#xff08;1&#xff09;…

SRIO系列-仿真测试

一、前言 前两篇已经讲述了SRIO协议的概况&#xff0c;以及xilinx SRIO IP核的使用方式&#xff0c;已经在搭建工程的过程中时钟和复位的注意事项。 二、设计框图 整个框图也是按照之前的工程进行搭建&#xff0c;首先时SRIO_Channel&#xff0c;由SRIO IP核和时钟、复位模块…

【C++题解】1607. 两位数运算

问题&#xff1a;1607. 两位数运算 类型&#xff1a;基本运算、拆位求解 题目描述&#xff1a; 小丽在编程课上学会了拆位运算&#xff0c;她已经可以拆出一个两位整数的十位和个位了&#xff0c;她想知道这个整数的十位 / 个位的结果是多少&#xff0c;请编程帮她实现&#…

异地网络如何在线共享文件夹?

信息的传输和共享变得异常便利。而对于拥有异地办公或分布式团队的公司或组织来说&#xff0c;跨地域的文件共享变得尤为重要。在这个背景下&#xff0c;“异地网络在线共享文件夹”应运而生。 异地网络在线共享文件夹的意义 对于异地办公的团队来说&#xff0c;共享文件夹是一…

《Super Simple Skybox》天空盒 -- 创造绝美天空的神奇工具!限时免费!

《Super Simple Skybox》天空盒 -- 创造绝美天空的神奇工具&#xff01;限时免费&#xff01; 前言内容介绍资源特色动态&#xff0c;美丽的天空在几秒钟内即插即用 功能列表领取兑换码 前言 ^^在这个充满创意与想象的世界里&#xff0c;Unity 免费资源犹如一颗璀璨的明珠&…

信息系统项目管理师0055:优化和持续改进(4信息系统管理—4.1管理方法—4.1.5优化和持续改进)

点击查看专栏目录 文章目录 4.1.5优化和持续改进1.定义阶段2.度量阶段3.分析阶段4.改进/设计阶段5.控制/验证阶段4.1.5优化和持续改进 优化和持续改进是信息系统管理活动中的一个环节,良好的优化和持续改进管理活动能够有效保障信息系统的性能和可用性等,延长整体系统的有效使…

redis的数据结构报错

文章目录 redis的数据结构报错Redis使用LocalDateTime报错问题 redis的数据结构报错 Redis使用LocalDateTime报错问题 SpringBoot整合Redis时&#xff0c;使用LocalDate以下报错 org.springframework.data.redis.serializer.SerializationException: Could not read JSON: C…

统一SQL-支持cast函数

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;Postgresql&#xff0c;TDSQL-MySQL&#xff0c;达梦8&#xff0c;LightDB-Oracle 操作目标 在Oracle中&#xff0c;cast函数允许将一种…