博客
关于我
Lock 锁底层实现
阅读量:791 次
发布时间:2023-02-06

本文共 940 字,大约阅读时间需要 3 分钟。

Lock 锁深入解析

1. Lock 锁概述

Lock 是 Java 中一个接口,包含多个实现类,如可重入锁、读锁和写锁。 其中,可重入锁是最常用的实现。Lock 的底层基于 AQS(AbstractQueuingSynchronizer)和 CAS(比较与交换)机制实现。

Lock 的核心方法包括 lock() 和 unlock()。 其中,可重入锁 ReentrantLock 有两种模式:公平锁和非公平锁。默认创建的锁是非公平锁,允许线程插队,采用先来先出的方式。

2. 公平锁与非公平锁的应用

  • 非公平锁:默认配置,线程插队可能导致其他线程饿死,适用于并发量高的场景。例如,消息队列(如 RocketMQ)中,若使用非公平锁,可能导致等待时间过长,系统不稳定。

  • 公平锁:按先到先出的方式分配锁,线程不会饿死。例如,RocketMQ 中的 queue 包使用了公平锁,确保线程的公平抢占。

3. Lock 与 synchronized 锁的区别

  • synchronized:Java关键字,基于 C++ 实现,无法控制锁的开启和结束,也无法中断线程执行。
  • Lock:Java层面的实现,支持获取锁状态、开启和释放锁,且可以中断线程,灵活性更高。
  • 自动锁:synchronized 自动获取锁释放,而 Lock 需手动调用 unlock(),否则可能导致死锁。

4. tryLock 与 lock 方法

  • tryLock:尝试获取锁,返回是否成功。适用于已知锁状态的场景。
  • lock:加锁方法。非公平锁模式下,先尝试获取锁,未获取则进入等待队列,循环抢锁。

5. Lock 机制解析

  • 锁状态:用整数表示,0 表示无锁,>0 表示占用锁的次数。
  • tryAcquire:通过 CAS 机制尝试获取锁,若成功则设置当前线程为锁拥有者。
  • lock() 方法:尝试获取锁,若成功则设置锁拥有者,否则进入等待队列。

6. 优化建议

  • 线程安全:尽量减少同步需求,优先使用 ThreadLocal。
  • 锁选择:根据场景选择公平锁或非公平锁,非公平锁适用于高并发,但需权衡线程饥饿风险。
  • 性能优化:减少锁的使用频率,优化并发访问方式,避免死锁。

希望以上内容对你有所帮助!如有疑问,欢迎在评论区留言。

转载地址:http://sbufk.baihongyu.com/

你可能感兴趣的文章
Lombok的使用及其原理
查看>>
Lombok的使用及注解含义
查看>>
lombok的注解
查看>>
Long Haul:极简风格的Jekyll博客主题
查看>>
long mode 分页_Mybatis 在dao中获取分页的总记录数
查看>>
Long.valueOf 将字符串、integer类型转换为long类型
查看>>
LongAdder原理
查看>>
longAdder源码解析
查看>>
Loop
查看>>
lora 微调3B模型微调前有5G 量化f16 后最后导出模型容量变小了只有2G了,为什么?
查看>>
LoRa关键参数(扩频因子,编码率,带宽)的设定及解释
查看>>
LoRA微调stable diffusion models:原理和实战
查看>>
LoRa术语
查看>>
LOSS损失函数值是什么意思?
查看>>
lounger自动化测试框架
查看>>
Low-Level 大一统:如何使用Diffusion Models完成视频超分、去雨、去雾、降噪等所有Low-Level 任务?
查看>>