当前位置: 首页 > news >正文

Java 中的锁分类

乐观锁/悲观锁

乐观锁: 就是没有加锁的实现. AtomicInteger中的实现就是不加锁的,通过自旋比较实现(CAS)

悲观锁: 就是加锁的实现,认为不加锁是会出问题的 ,ReentrantLock和synchronized都是悲观锁

可重入锁

ReentrantLock和synchronized都是可重入锁

可重入锁又名递归锁, 指的是一个线程在外层方法获得锁时,可以直接进入到内层的加锁的方法中.

自旋锁

指的是对synchronized获得锁的一种描述(特点), 线程在获得锁时,是自旋的不断尝试去获得锁

公平锁/非公平锁

公平锁: 就是排队获得锁,有先来后到 ReentrantLock 既可以是公平锁也可以是非公平锁

非公平锁: 就是抢锁,谁抢到谁执行, 有可能后来的线程先抢到锁 synchronized ReentrantLock

读写锁

ReentrantReadWriteLock

特点: 读读不互斥, 读写互斥, 写写互斥

适合读(查询)多,写少的场景, 提高读的效率

共享锁和独占锁

独占锁: synchronized ReentrantLock都是独占锁,就是有我没他,一次只能有一个线程执行.

共享锁: 一个锁可以被多个线程持有, 读写锁中的读锁就是共享锁

synchronized锁的实现

jdk1.7之后,对synchronized锁进行了优化(jdk7之前synchronized锁没有状态,都是自旋的获取锁),

jdk7之后为synchronized锁设计了不同的状态.

无锁状态: 没有线程进入到同步代码块就是无锁状态

偏向锁状态: 只有一个线程访问同步代码块时,同步锁中记录线程id,下次线程访问时,可以快速的获得锁.

轻量级锁状态: 当线程数量大于1个之后,锁状态由偏向锁升级为轻量级锁, 线程不会阻塞,以自旋方式获得锁,

提高获取锁的效率.

重量级锁状态: 当锁状态为轻量锁时,如果线程自旋到一定次数还获取不到锁,那么锁会升级为重量级锁,让获取不到锁的线程进入到阻塞状态,等待操作系统调度.

使用synchronized锁的时候,必须为锁提供一个同步锁对象的,此对象就是用来记录锁状态的

对象中有一个区域叫对象头,对象头中有一块区域叫mark word,记录对象运行时的一些数据,如锁状态,哈希值,GC分代年龄,当前线程id.

synchronized是java中内置的一种的锁,底层实现是靠底层指令进行控制的,

使用时必须提供一个同步锁对象,用来记录锁的各种状态.

AQS

AbstractQueuedSynchronizer 抽象同步队列, 并发包下面很多类的底层实现都会用到

内部有一个int类的变量state,用来记录有没有线程使用

内部会构建一个队列,用来存储没有获得锁的线程

 

 

ReentrantLock锁实现

ReentrantLock 基于 AQS的,

ReentrantLock 可以实现公平锁和非公平锁

内部结构

 

 

 

公平和非公平的区别  

 

 

http://www.lryc.cn/news/585769.html

相关文章:

  • 【牛客刷题】吃糖果----糖果甜度问题(贪心策略详解)
  • 小车循迹功能的实现(第六天)
  • UML 与 SysML 图表对比全解析:软件工程 vs 系统工程建模语言
  • 持有对象-泛型和类型安全的容器
  • 线程通信V
  • 【Linux】系统引导修复
  • InnoDB 存储引擎的 架构
  • 渗透测试之木马后门实验
  • 世界现存燃油汽车品牌起源国别梳理
  • k8s新增jupyter服务
  • 中国国际会议会展中心模块化解决方案的技术经济分析报告
  • 【机器学习应用】基于集成学习的电力负荷预测系统实战案例
  • Linux设备树(dts/dtsi/dtb、设备树概念,设备树解析,驱动匹配)
  • kubernetes单机部署踩坑笔记
  • 【linux网络】深入理解 TCP/UDP:从基础端口号到可靠传输机制全解析
  • 【理念●体系】Windows AI 开发环境搭建实录:六层架构的逐步实现与路径治理指南
  • ATAM与效用树:架构评估的核心方法论
  • 鸿蒙 Secure Boot 全流程解析:从 BootROM 到内核签名验证的实战指南
  • 使用 lstrip() 和 rstrip() 方法
  • OpenAI 将推 AI Agent 浏览器:挑战 Chrome,重塑上网方式
  • C语言文件读写操作详解:fgetc与feof函数的应用
  • 上位机知识篇---Git符号链接
  • vue3 el-input 通过数组 获取显示
  • 【构建Tomcat版本检查工具:自动检测并提醒版本更新】
  • [面试] 手写题-插入排序
  • Redis命令参考手册
  • (C++)set集合相关知识(STL标准库)(C++教程)(set集合基础教程)
  • 供应链管理-计划:产能策略
  • 匿名函数作递归函数引用
  • 声明式 vs 编程式:Spring事务管理全对比