浅谈java中的锁

根据标准锁的分类

  • 偏向锁 / 轻量级锁 / 重量级锁;
  • 可重入锁 / 非可重入锁;
  • 共享锁 / 独占锁;
  • 公平锁 / 非公平锁;
  • 悲观锁 / 乐观锁;
  • 自旋锁 / 非自旋锁;
  • 可中断锁 / 不可中断锁。

偏向锁 / 轻量级锁 / 重量级锁

偏向锁

故名思就是偏向锁的拥有者,就可以直接获得锁,开销很小,性能最好。

轻量级锁

它是从偏向锁升级到的轻量级锁,竞争时间短,用CAS实现的并且线程会通过自旋的形式尝试获取锁,而不会陷入阻塞。

重量级锁

轻量级锁不满足就会生成重量级锁,重量级锁会让其他
申请却拿不到锁的线程进入阻塞状态。

锁发生的顺序:无锁→偏向锁→轻量级锁→重量级锁

可重入锁 / 非可重入锁

可重入锁指是线程当前已经持有这把锁了,能在不释放这把锁
的情况下,再次获取这把锁。
非可重入锁线程获取到锁,在不释放的情况下不能再次获取锁。

可重入锁典型的就是ReentrantLock

共享锁 / 独占锁

共享锁可以被多个同时线程获得;独占锁是只能被同一个线程获得的。
读写锁的理念正好诠释了共享锁和独占锁,读锁是共享说而写锁就是独占锁。

公平锁 / 非公平锁

公平锁是线程排队先到先得,不能插队;
非公平锁是线程可以插队。

悲观锁 / 乐观锁

悲观锁获取资源之前,必须先拿到锁
乐观锁利用 CAS 理念,在不独占资源的情况,完成了对资源的修改。

自旋锁 / 非自旋锁

利用cpu资源,自旋锁是线程自我旋转;
非自旋锁是拿不到锁就直接放弃,或者进行其他
的处理逻辑,例如去排队、陷入阻塞。

可中断锁 / 不可中断锁

可中断锁是一旦线程申请了锁,就没有回头路了,只能等到拿到锁以后才能进行其他的逻辑处理。
可中断锁是不想获取了,可以在中断之后去做其他的事情。

CAS(Compare and Swap)是一种乐观锁技术,用于实现并发算法。CAS操作包含三个操作数:内存位置、预期原值和新值。在执行CAS操作时,如果内存位置的值与预期原值相匹配,则处理器会自动将该位置更新为新值;如果不匹配,则处理器不做任何操作。CAS允许多个线程同时尝试更新同一个变量,但只有一个线程能够成功。CAS是实现原子性的关键技术之一,可以保证在并发环境下的安全性。CAS操作适用于自旋锁、无锁队列、CAS-based的并发控制等场景。

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

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

相关文章

【管理运筹学】背诵手册(六)| 图与网络分析(最大流问题,最小费用最大流问题)

六、图与网络分析 最大流问题 最大流问题的数学规划模型为: max ⁡ v f 12 f 13 { f 12 f 13 − f 57 − f 67 0 f 13 f 23 f 34 f 35 . . . 0 ≤ f i j ≤ c i j \max vf_{12}f_{13}\\ \begin{cases} f_{12}f_{13}-f_{57}-f_{67}0 \\ f_{13}f_{23}f_{34}f…

虚拟数据生成_以Python为工具

生成虚拟数据_以Python为工具 生成虚拟数据技术在现实生活中具有多个重要的应用领域。它为数据隐私保护、机器学习算法开发、数据处理和可视化等方面提供了实用且有价值的解决方案。尤其是能满足定制化需求的虚拟数据,在预期的方向上让数据定向随机。 &#x1f339…

原生GPT本地及云端部署方式保姆级教程

前提条件 部署必须要有一个超过1年的Github账号 本地服务部署 运行效果 部署方法 下载安装包 暂时无法在飞书文档外展示此内容 GitHub授权登录: https://dash.pandoranext.com/ 登录后是这个样子: 复制下面红框里面这个License Id 编辑Config.js…

flutter开发实战-轮播Swiper更改Custom_layout样式中Widget层级

flutter开发实战-轮播Swiper更改Custom_layout样式中Widget层级 在之前的开发过程中,需要实现卡片轮播效果,但是卡片轮播需要中间大、两边小一些的效果,这里就使用到了Swiper。具体效果如视频所示 添加链接描述 这里需要的效果是中间大、两边…

面试问题--Linux网络编程

Linux网络编程涉及在Linux操作系统上使用套接字(socket)等工具进行网络通信。以下是一些与Linux网络编程相关的主题: 套接字编程: 在Linux中,套接字是网络编程的基础。可以使用C语言中的socket库来创建套接字。套接字…

【人工智能Ⅰ】实验3:蚁群算法

实验3 蚁群算法的应用 一、实验内容 TSP 问题的蚁群算法实现。 二、实验目的 1. 熟悉和掌握蚁群算法的基本概念和思想; 2. 理解和掌握蚁群算法的参数选取,解决实际应用问题。 三、实验原理 1.算法来源 蚁群算法的基本原理来源于自然界…

C++学习 --谓词

目录 1, 什么是谓词 1-1, 一元谓词 1-2, 二元谓词 1, 什么是谓词 返回bool类型的仿函数, 叫着谓词, 分为一元谓词和二元谓词 1-1, 一元谓词 operator()接收一个参数,叫着一元谓…

python第1天之常识及环境安装

前言: 当谈到编程语言的流行度时,Python绝对是其中之一。Python是一种高级编程语言,其语法简单易懂,适用于各种不同的应用领域,包括Web开发、数据分析、人工智能等。在本文中,我们将探讨一些关于Pyth…

【JavaScript】3.2 JavaScript性能优化

文章目录 1. 避免全局查找2. 避免不必要的属性查找3. 使用快速的JavaScript方法4. 避免不必要的DOM操作5. 使用Web Workers进行后台处理总结 性能优化是任何编程语言的重要组成部分,JavaScript也不例外。在这个章节中,我们将探讨如何优化JavaScript代码&…

GAN:WGAN

论文:https://arxiv.org/pdf/1701.07875.pdf 发表:2017 WGAN 算法流程 从GAN 到 WGAN 的转变 相比于原始 GAN,WGAN 只需要修改以下几点,就能使得训练更稳定,生成质量更高: 1. 此时的判别器相当于做回归…

【DDD】领域驱动设计总结——如何构造领域模型

文章目录 一 分离领域二 领域对象分类2.1 实体(ENTITY)2.2 值对象(VALUE OBJECT)2.3 服务(SERVICE)2.4 模块(MODULE) 三 管理领域对象的生命周期3.1 聚合(AGGREGATE)3.2 工厂(FACTORY)3.3 存储库…

记i18n ally工具检测语言失败的一则思路

情况 只有某个文件检测不到汉字,其余都可以检测出来,困扰许久,发个博客记一下思路 解决方法: 1、肯定不是i18n ally工具的问题,因为其他的vue都能检测成功 2、是这个文件的问题 采用排除法 先删掉所有代码&#…

《Effective C++》条款27

尽量少做转型动作 class A { public:A(int x) :a(x) {};virtual void add(){a;} private:int a; }; class B :public A { public:B(int x) :b(x),A(x) {};virtual void add(){static_cast<A>(*this).add();b;}private:int b; }; 如上描述把子类转型为A类&#xff0c;调用…

解决keil右键Go To Definition跳转不过去的问题

解决&#xff1a; 在魔法棒中如图所示打上√

rabbitmq技术

1&#xff0c;docker运行rabbitmq docker run --restartalways -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq 2&#xff0c;新增管理员用户 rabbitmq服务&#xff0c;添加用户以及授权_rabbitmq添加用户授权_ROBOT玲玉的博客-CSDN博客

flask web开发学习之初识flask(二)

文章目录 一、创建程序实例并注册路由1. 为视图绑定绑定多个URL2. 动态URL 二、启动开发服务器1. 自动发现程序实例2. 管理环境变量3. 使用pycharm运行服务器4. 更多的启动选项5. 设置运行环境6. 调试器7. 重载器 一、创建程序实例并注册路由 app.py # 从flask包中导入flask类…

NoSQL 数据建模错误会降低性能

数据建模错误是破坏性能的最简单方法之一。当您使用 NoSQL 时&#xff0c;特别容易搞砸&#xff0c;&#xff08;讽刺的是&#xff09;NoSQL 往往用于对性能最敏感的工作负载。NoSQL 数据建模最初可能看起来非常简单&#xff1a;只需对数据进行建模以适应应用程序的访问模式。但…

Elastic Search

ElasticSearch 持续更新中… 选择es的原因 在数据量非常大的时候&#xff0c;业务进行模糊查询会导致索引失效&#xff0c;查询效率低下&#xff0c;使用es进行查询&#xff0c;可以提高查询速度。 text和keyword类型的区别 keyword 类型是不会分词的&#xff0c;直接根据字…

矢量图与位图区别

文章目录 目的区别 目的 了解矢量图与位图区别。 区别 矢量图和位图是两种不同类型的图形图像&#xff0c;它们之间的主要区别在于存储和表示图像的方式&#xff0c;以及在不同应用场景下的优势和劣势。 项目Vector GraphicsBitmap存储方式矢量图使用数学公式和几何图形的描…

linux /proc 文件系统

/proc系统是一个伪文件系统&#xff0c;它只存在内存当中&#xff0c;而不占用外存空间&#xff0c;以文件系统的方式为内核与进程提供通信的接口。 /proc目录下有很多以数字命名的目录&#xff0c;每个数字代表进程号PID它们是进程目录。系统中当前运行的每一个进程在/proc下都…