显式锁的分类

显式锁的分类

显式锁 有很多种,从不同的角度来看,显式锁大概有以下几种分类

  1. 可重入锁 和 不可重入锁
  2. 悲观锁 和 乐观锁
  3. 共享锁 和 独占锁
  4. 可中断锁 和 不可中断锁
  5. 公平锁 和 非公平锁

1.可重入锁(Reentrant Lock)与不可重入锁

可重入锁: 可重入锁允许同一个线程多次获取同一把锁而不被阻塞,即在已经持有锁的情况下再次尝试获取该锁时仍能成功。Java中的ReentrantLock就是一个典型的可重入锁实现,它内部维护一个计数器来记录锁被重入的次数,每次成功获取锁时计数器加1,释放锁时计数器减1,直到计数器为0时锁才真正释放。这种设计允许递归调用和嵌套锁的场景,避免了自我死锁。

不可重入锁: 不可重入锁在设计上不允许一个线程重复获取同一把锁,一旦锁被某线程获取,其他线程包括持有锁的线程再次尝试获取时都会被阻塞。在Java标准库中并没有直接提供不可重入锁的实现,因为可重入锁是更为实用且安全的选择。

2.悲观锁(Pessimistic Lock)与乐观锁(Optimistic Lock)

悲观锁: 悲观锁假设最坏的情况,认为每次访问共享资源都可能发生冲突,因此在访问数据前先锁定资源,阻止其他线程访问。这通常通过独占锁实现,例如在数据库中通过行锁或表锁。悲观锁会减少并发性能,但能确保数据的一致性。

乐观锁: 乐观锁则持乐观态度,假定读多写少,大多数情况下不会有并发冲突,仅在提交更新时检查数据是否被其他线程修改过。乐观锁通常通过版本号或时间戳来实现,如果数据在更新前已被其他线程修改,则更新失败并可能重新尝试。乐观锁降低了锁的竞争开销,适合读多写少的场景。

3.共享锁(Shared Lock)与独占锁(Exclusive Lock)

共享锁: 共享锁允许多个线程同时持有锁,即多个读取者可以同时访问共享资源。它适用于读操作较多的场景,能够提升并发度。Java中的ReentrantReadWriteLock中的读锁(ReadLock)就是共享锁的典型例子,它允许多个读锁共存,但排斥写锁。

独占锁: 独占锁(排他锁)在同一时间只允许一个线程持有,无论是读操作还是写操作。synchronized关键字、ReentrantLockReentrantReadWriteLock中的写锁(WriteLock)都是独占锁的实现。独占锁确保了在任一时刻只有一个线程可以修改共享资源,避免了并发写冲突。

4.可中断锁与不可中断锁

可中断锁: 可中断锁允许等待锁的线程在等待期间响应中断信号,通过抛出InterruptedException中断线程的等待状态,从而可以更灵活地控制线程的生命周期。ReentrantLocklockInterruptibly()方法就提供了可中断的锁获取行为。

不可中断锁: 不可中断锁在等待获取锁的过程中不会响应中断请求,一旦开始等待就会一直等到获取到锁或者其它原因导致等待结束。Java中的synchronized块或方法以及ReentrantLocklock()方法默认表现为不可中断锁,这可能导致线程长时间阻塞而无法响应外部中断。

5.公平锁(Fair Lock) 和 非公平锁(Nonfair Lock)

公平锁:公平锁遵循严格的FIFO(先进先出)原则,即线程按照请求锁的顺序来获取锁。如果一个线程已经在等待队列中,那么它会优先于新来的线程获得锁,即使新线程先尝试获取锁。

非公平锁:非公平锁不保证线程获取锁的顺序,新来的线程有可能直接抢占正在等待的线程而获得锁。线程在尝试获取锁时,会直接尝试获取,如果此时锁未被占用,则直接获得锁,否则才会进入等待队列。

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

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

相关文章

js学习第一周

1.变量 1.变量命名规则 严格区分大小写不能以数字开头不能是关键字,保留字,不能用name用作变量名小驼峰命名法命名符号只能用下划线 _ 和doller $并且中间不能有空格 2.类型推断 JavaScript是一种动态类型的语言,这意味着你不需要在声明变…

基于JAVA GUI的JDBC连接数据库

要在Java GUI中连接数据库,需要执行以下几个步骤: 导入必要的包。你需要导入Java数据库连接相关的包,例如java.sql和javax.sql。 与数据库连接相关的类和接口。 (1)DriverManger类。DriverManager类用于加载JDBD驱动…

【每日力扣】84. 柱状图中最大的矩形 与 295. 数据流的中位数

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害 84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为…

redis6.2.7 搭建一主多从

1、集群规划 节点端口角色192.168.137.1026379master192.168.137.1026380slave192.168.137.1036381slave 2、伪集群搭建 2.1 创建fake_cluster 目录存放 公共配置文件 # 进入redis目录 cd /app/apps/redis-6.2.7# 创建存放伪集群的目录 mkdir fake_cluster#复制redis.conf到…

DTC 2024回顾丨云和恩墨重塑数据库内核技术,革新企业降本增效之道

在数字化浪潮席卷全球的当下,关系型数据库作为市场主导力量的地位依然稳固。然而,面对新兴数据库与服务形态的挑战,以及企业日益强烈的降本增效需求,数据库技术的发展必须紧跟时代步伐,充分发挥资源效能以提升企业竞争…

03自动辅助导航驾驶NOA

NOA是自动辅助导航驾驶或领航辅助驾驶的缩写,其全称为Navigate On Autopilot。在设定好导航路线并进入NOA的可使用路段后,驾驶员即可开启辅助驾驶。在A点到B点的过程中,NOA能够实现自动上下匝道、自行超车、自行变道、自适应巡航等多种功能。…

【机器学习300问】99、多通道卷积神经网络在卷积操作时有哪些注意事项?

一、多通道卷积神经网络示例 还是以图像处理为例,如果你的目标不仅是分析灰度图像特性,还打算捕捉RGB彩色图像的特征。如下图,当面对一张66像素的彩色图像时,提及的“3”实际上是指红、绿、蓝三种颜色通道,形象地说&am…

Nginx R31 doc-11-Compression and Decompression 压缩与解压缩

前言 大家好,我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的,可以参考我的另一个项目: 手写从零实现简易版 tomcat minicat 压缩与解压缩 压缩…

Java 简易操作Excel

首先,我们需要创建一个数据库表来存储这些单词及其相关信息。以下是一个简单的SQL语句示例,用于创建这样一个表: sql CREATE TABLE EnglishWords (id INT AUTO_INCREMENT PRIMARY KEY,word VARCHAR(255) NOT NULL,phonetic TEXT NOT NULL,c…

书生·浦语第二期-笔记2

课程链接:https://github.com/InternLM/Tutorial/tree/camp2 视频地址:轻松玩转书生浦语大模型趣味Demo_哔哩哔哩_bilibili 大模型及InternLM介绍 大模型:人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型 特点&#xff1a…

使用json-server来创建mockserver

代替mock模拟数据 1.使用mkdir vue3-ts-server 创建目录 2.npm init -y 生成package.json的依赖配置文件 详见json-server - npm 3.cnpm install json-server -S 4.目录结构是data,public,src{app.js , router.js , db.js &…

【Linux杂货铺】进程通信

目录 🌈 前言🌈 📁 通信概念 📁 通信发展阶段 📁 通信方式 📁 管道(匿名管道) 📂 接口 ​编辑📂 使用fork来共享通道 📂 管道读写规则 &…

初中英语优秀作文分析-002Who stole the cupcake-谁偷了纸杯蛋糕?

更多资源请关注纽扣编程微信公众号 记忆树 1 One Sunday afternoon, Leslie was at home with her kids, 3-year-old Angel, 6-year-old Carl, and 7-year-old Tony. 翻译 一个周日的下午,Leslie和她的孩子们在家,他们是3岁的Angel,6岁的…

镜子摆放忌讳多

镜子是我们日常生活中不可或缺的物品。在风水中,镜子的作用非常多,能够起到一定的作用。镜子的摆放位置也是非常有讲究的,摆放不好会直接影响到家人的事业、财运、婚姻乃至健康等诸多方面。 第一个风水忌讳,镜子对大门。大门的正前…

Linux防火墙之iptables(二)

一.SNAT策略概述 1.SNAT 策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet(私有IP不能在Internet中正常路由) 局域共享上网 2.SNAT 策略的原理 源地址转换,Source Network Address Translation 修改数据包的源地址 未作SNAT转换…

用three.js+echarts给公司写了一个站点数据大屏系统经验总结

时间过的好快,参加公司的新项目研发快一年了,五一机器人项目首秀,我们遇到了高并发集中下单情景,然后海量数据处理场景来了,给我在后端领域的高并发实践业务上画上了漂亮的一笔经验。人都是在磨练中成长,我很感谢这次给我的机会,虽然有点累,但也有点小成就。正好现在有…

时隔一年半。。。

大概一年半的时间没登录,经历了蛮多事情,包括不满,辞职,备考,笔试,面试… 大体上是蛮幸运的,又要去新的单位工作了,第一份事业编的工作做得真的很痛苦,大概是因为丢掉了专…

AGI系列(1):掌握AI大模型提示词优化术,提问准确率飙升秘籍

当我们向AI大模型提问时,通常人们的做法是有什么问题,就直接去问,得到大模型的回复结果,时好时坏,完全没有可控性。 那么有没有一种方式或是一套方法,可以让我们向大模型提问时,得到的结果更准确…

nacos 2.3.3 Windows系统安装详细版

1,下载 https://github.com/alibaba/nacos/releases 2,解压 3,将nacos的内置库(derby),修改为我们自己的 mysql 3.1 创建一个数据库 3.2 连接数据库 3.3 执行mysql 脚本,在nacos的conf 目录下 mysql-schema.sql 执…