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

1分钟快速了解——Java几种常见的锁

  • 乐观锁
  • 悲观锁
  • 公平锁
  • 非公平锁
  • 可重入锁
  • 独占锁(写锁)
  • 共享锁(写锁)

乐观锁(自旋锁):认为共享资源每次被访问都不会出现安全问题,无需加锁。

CAS算法和版本号法就是乐观锁的具体实现。

CAS只有当旧值和预期值一样,再将旧值更新为新值。但是CAS存在ABA问题,即对数据进行修改,随后又复原为原值的问题。解决这一问题可以使用版本号法。

悲观锁:认为共享资源每次被访问时都会出现安全问题,故每次获取资源都需要上锁。

synchronizedReentrantLock等独占锁都是悲观锁。

公平锁:锁被释放后,先申请的线程先获得锁。性能比较差,因为CPU唤醒线程具有一定的开销。

非公平锁:锁被释放后,后申请的线程可能先后去锁,是随机的或者按照优先级排序的。性能更好,因为减少了CPU唤醒线程的开销。但是也可能导致饥饿现象(某些线程永远获取不到锁)。

ReentrantLock默认创建的是非公平锁,可以通过其构造器传参创建公平锁和非公平锁。
true:公平锁
false:非公平锁

可重入锁:一个线程可以多次获取同一个锁。如一个线程获得了一个锁,这时锁还没有释放,而线程想要再次获取锁是可以的,如果是不可重入锁,就会导致死锁。

synchronizedReentrantLock都是可重入锁。

独占锁(写锁):最多只能同时被一个线程获取。

共享锁(读锁):可以同时被多个线程获取。

synchronized和ReentrantLock的区别

区别synchronizedReentrantLock
加锁、解锁自动手动,配合try、finally语句块实现
中断等待锁的线程不可中断能够中断
超时等待不支持支持
支持公平/非公平锁非公平锁构造方法工作两种锁

synchronized的锁升级

过程:偏向锁—>轻量级锁—>重量级锁

偏向锁:jdk8默认是轻量级锁,但如果设定了 -XX:BiasedLockingStartupDelay = 0 ,则会获得一把偏向锁,并且锁对象的markword会记录偏向锁线程ID。

轻量级锁:当下一个线程竞争偏向锁时,会判断markword中的偏向锁ID是否为当前线程,如果不相等,偏向锁就会升级会轻量级锁。每个线程再通过CAS自旋的操作获取锁。

重量级锁:如果锁竞争加剧(线程自旋次数获自旋线程数超过某个阈值),轻量级锁升级为重量级锁。申请资源的线程会被挂起,进入到操作系统内核态的等待队列中,等待操作系统调度,然后映射回用户态。

在这里插入图片描述

相关文章:

  • Django Admin: 实现基于数据库实际值的动态过滤器
  • Unity游戏制作中的C#基础(6)方法和类的知识点深度剖析
  • 前端如何转战鸿蒙
  • 通过LM Studio本地私有化部署DeepSeek-R1模型,无网络也能用
  • 【Java】集成easyexcel
  • 最新版IDEA下载安装教程
  • LangChain-基础(prompts、序列化、流式输出、自定义输出)
  • ESP32 websocket-client
  • 创建一个简单的spring boot+vue前后端分离项目
  • LangChain大模型应用开发:自定义工具调用
  • 基于 Highcharts 实现 Vue 中的答题统计柱状图组件
  • vue3 采用xlsx库实现本地上传excel文件,前端解析为Json数据
  • MES系统中物料核心属性定义
  • 探讨TikTok中匿名用户的社交关系
  • 第二章:17.3 随机森林算法
  • 伪404兼容huawei生效显示404
  • #渗透测试#批量漏洞挖掘#Cleo产品远程命令执行漏洞(CVE-2024-50623)
  • 大数据SQL调优专题——引擎优化
  • java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)
  • 进程的介绍--进程状态/切换
  • 财政部:4月份中央收入增长1.6%,今年以来首月实现正增长
  • 东南亚五大经济体一季度增长放缓,美国关税大棒或阻全年增长
  • 对话作家吉井忍:“滚石”般的生活,让我看到多种人生可能
  • 持续降雨存在落石风险,贵州黄果树景区水帘洞将封闭至6月初
  • 纽约市长称墨海军帆船撞桥已致2人死亡,撞桥前船只疑似失去动力
  • 美国贸易政策|特朗普模式:你想做交易吗?