Java中的锁策略

1 乐观锁 vs 悲观锁

锁的实现者预测当前锁冲突的概率,可分为乐观锁和悲观锁。

乐观锁:发生冲突的概率较小;主要使用在读操作较多的情况下。

悲观锁:发生冲突的概率较大;主要使用在写操作较多的情况下。

2 轻量级锁 vs 重量级锁

轻量级锁:加锁解锁,速度更快,更高效;

重量级锁:加锁解锁,速度更慢,更低效。

一般情况下,乐观锁可能是轻量级锁,悲观锁可能是重量级锁。

3 自旋锁 vs 挂起等待锁

自旋锁:是轻量级锁的一种典型实现。

一旦锁被释放,即可得到锁。

通常是纯用户态,不需要经过内核态(时间相对较短)

挂起等待锁:是重量级锁的一种典型实现。

通过内核的状态,实现挂起等待(时间相对较长)

4 互斥锁 vs 读写锁

互斥锁:只是单纯的加锁,没有细分;

读写锁:分为读锁和写锁。

读写锁分为:

1)读锁和读锁之间,不会产生锁竞争

2)读锁和写锁之间,会产生锁竞争;

3)写锁和写锁之间,会产生锁竞争。

5 可重入锁 vs 不可重入锁

一个线程针对一把锁,连续加锁两次,出现死锁就是不可重入锁,不发生死锁就是可重入锁。

产生死锁的必要条件:

1互斥使用:一个线程拿到锁后,另外一个线程不可再使用。

2 不可抢占:一个线程拿到锁后,只能自己释放,其他线程不能抢占。

3 请求和保持。

4 循环等待。

6 公平锁 vs 非公平锁

约定:遵循 先来后到 的锁称为公平锁,不遵循 先来后到 的锁称为非公平锁。

系统对于线程的调度是随机的,自带的synchronized锁是非公平的。如果想成为公平锁,则需要在synchronized基础上,利用队列来记录加锁线程的顺序。

注:

synchronized的特点:

1 synchronized既是乐观锁,又是悲观锁;

2 既是轻量级锁,又是重量级锁;

3 轻量级锁基于自旋锁实现,而重量级锁基于挂起等待锁实现;

4 synchronized不是读写锁;

5 synchronized是可重入锁;

6 synchronized是非公平锁。

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

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

相关文章

『K8S 入门』二:深入 Pod

『K8S 入门』二:深入 Pod 一、基础命令 获取所有 Pod kubectl get pods2. 获取 deploy kubectl get deploy3. 删除 deploy,这时候相应的 pod 就没了 kubectl delete deploy nginx4. 虽然删掉了 Pod,但是这是时候还有 service&#xff0c…

轻松搭建FPGA开发环境:第三课——Vivado 库编译与设置说明

工欲善其事必先利其器,很多人想从事FPGA的开发,但是不知道如何下手。既要装这个软件,又要装那个软件,还要编译仿真库,网上的教程一大堆,不知道到底应该听谁的。所以很多人还没开始就被繁琐的开发环境搭建吓…

电子学会C/C++编程等级考试2021年06月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:逆波兰表达式 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* +…

04 在Vue3中使用setup语法糖

概述 Starting from Vue 3.0, Vue introduces a new syntactic sugar setup attribute for the <script> tag. This attribute allows you to write code using Composition API (which we will discuss further in Chapter 5, The Composition API) in SFCs and shorte…

智能优化算法应用:基于动物迁徙算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于动物迁徙算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于动物迁徙算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.动物迁徙算法4.实验参数设定5.算法结果6.…

第十六章 : Spring Boot JWT 集成redis实现分布式token

第十六章 : Spring Boot JWT 集成redis实现分布式token 前言 本章知识重点:了解JWT 是什么,通过第一个JWT程序理解JWT的标头(Header)、有效载荷(Payload)和签名(Signature),通过Spring Boot JWT 集成redis的实践案例解读,灵活掌握JWT三大应用场景。 JWT是什么 J…

不同的葡萄酒瓶盖会影响葡萄酒饮用的体验

首先&#xff0c;不同的葡萄酒瓶盖会影响我们找到想要喝的葡萄酒的难易程度。螺旋盖、Zork瓶塞和起泡酒“蘑菇形瓶塞”赢得了直接的满足感&#xff0c;它们只需要拔瓶塞不需要开瓶器。来自云仓酒庄品牌雷盛红酒分享对于所有其他的酒瓶封口&#xff0c;我们都需要一个工具来打开…

论文阅读——Mask DINO(cvpr2023)

DINO是检测&#xff0c;Mask DINO是检测分割。 几个模型对比&#xff1a; 传统的检测分割中&#xff0c;检测头和分割头是平行的&#xff0c;Mask DINO使用二分图匹配bipartite matching提高匹配结果的准确性。 box对大的类别不计算损失&#xff0c;因为太大了&#xff0c;会…

Mac安装Typora实现markdown自由

一、什么是markdown Markdown 是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。 它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&#xff09;文档。这种语言吸收了很多在电子邮…

verilog语法进阶-移位寄存器原语-单输入单输出

概述 verilog c代码 module primitive1(input clk , // system clock 50Mhz on boardinput rst_n, // system rst, low active input a , output y1, // output signaloutput y // output signal);SRLC16_1 #(.INIT(16h0000) // Initial Value of Shift Register ) SRLC16_1…

Python学习笔记第七十六天(OpenCV视频应用)

Python学习笔记第七十六天 OpenCV视频应用从相机中读取视频从文件中播放视频保存视频 后记 OpenCV视频应用 从相机中读取视频 OpenCV提供了cv2.VideoCapture()函数&#xff0c;用于从相机中读取视频。这个函数接受一个参数&#xff0c;即摄像头设备的编号。默认情况下&#x…

SpringCloud-高级篇(八)

&#xff08;1&#xff09;TCC模式 前面学了XA和AT模式&#xff0c;这两种模式最终都能实现一致性&#xff0c;和隔离性&#xff0c;XA是强一致&#xff0c;AT是最终一致&#xff0c;隔离性呢XA是在第一阶段不提交&#xff0c;基于事务本身的特性来完成隔离&#xff0c;AT则是…

uniGUI学习之UniTreeview

UniTreeview中能改变一级目录的字体和颜色 function beforeInit(sender, config) { ID"#"config.id; Ext.util.CSS.createStyleSheet( ${ID} .x-tree-node-text{color:green;font-weight:800;} ${ID} .x-tree-elbow-line ~ span{color:black;font-weight:400;} ); }

Kubernetes Pod 网段与主机内网网段互通

开发环境的需求 开发环境部署 K8s 后&#xff0c;服务器会部署在 K8s 里&#xff0c;通常 Pod 网段被隔离&#xff0c;主机无法访问 实际开发需求&#xff0c;往往需要当前开发调试的服务主机本地部署&#xff0c;其他服则在 K8s 内 因此&#xff0c;使用 K8s &#xff0c;必…

uniGUI学习之UniHTMLMemo1富文本编辑器

1]系统自带的富文本编辑器 2]jQueryBootstarp富文本编辑器插件summernote.js 1]系统自带的富文本编辑器 1、末尾增加<p> 2、增加字体 3、解决滚屏问题 4、输入长度限制问题 5、显示 并 编辑 HTML源代码(主要是图片处理) 1、末尾增加<p> UniHTMLMemo1.Lines…

【MySQL】启动 和 连接 MySQL

启动停止 mysql安装成功后在cmd输入 net start mysql80 //启动 net stop mysql80 //停止 mysql连接 方式1. 通过客户端去连接 方式2.使用cmd去连接 描述&#xff1a;-u是指定 用户 -p是指定密码 mysql -u root -p password

NVM下载和安装NodeJS教程(环境变量配置)

前言:一个公司很多项目,可能每个项目node版本要求不一样,导致每次切换项目,你要重新下载node,非常麻烦,这个时候,就有了nvm,非常的方便实用,也是程序员必备. 1.nvm是什么? nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.…

git各分支简介

一、master 主分支 所有用户可见的正式版本&#xff0c;都从master发布&#xff08;也是用于部署生产环境的分支&#xff0c;确保master分支稳定性&#xff09; 主分支作为稳定的唯一代码库&#xff0c;不做任何开发使用 master 分支一般由develop以及hotfix分支合并&#…

基于java+swing+mysq学生成绩管理系统(含课程报告)

基于javaswingmysq学生成绩管理系统_含课程报告 一、系统介绍二、功能展示三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统&#xff1f; 四、其它1.其他系统实现 五、源码下载 一、系统介绍 本系统使用 Swing MySQL IntelliJ IDEA 开发。为管理人员提供…

生产环境_Spark解析JSON字符串并插入到MySQL数据库

业务背景&#xff1a; 最近开发有一个需求&#xff0c;是这样的 我需要将一段从前端传过来的JSON字符串进行解析&#xff0c;并从中提取出所需的数据&#xff0c;然后将这些数据插入到MySQL数据库中。 json格式样例如下 { \"区域编号\": \"001\", …