JavaSE---多线程---显式锁
1、概述
1.1、jdk5之前,用于 调节共享对象访问机制 只有 synchronized、volatile;
jdk5之后,提供了 显示锁:Lock、ReentrantLock...;
显式锁 并不是 内部锁机制 的替代,而是 当内部锁被证明受到局限时,提供可选择的高级特性;
1.2、Lock接口
1.2.1、Lock接口,定义了 一些 抽象的锁操作;
与内部锁机制不同,Lock 提供了 无条件的、可轮询、定时、可中断 的 锁获取操作;
所有的加锁、解锁都是 显式的;
1.2.2、Lock的实现 提供了 与 内部锁 相同的内存可见性;
但 加锁的语义、调度算法、顺序保证、性能特征 与内部锁不同;
1.3、ReentrantLock接口
1.3.1、ReentrantLock 实现了 Lock 接口,提供了 与 synchronized 相同的互斥、内存可见性;
1.3.2、为何要创建与内部锁如此相似的机制?
内部锁 大部分情况下 能很好地工作,但是 有一些功能上的局限(不能中断 那些正在 等待获取锁的线程,且 请求锁失败的情况下,必须无限等待);
1.3.3、注意事项:
a,锁 必须 在finally 块中释放;
b,如果 锁守护的代码 在 try块之外抛出异常,它将 永远不会被释放了;
1.3.4、可轮询、可定时的锁获取
I、可定时、可轮询的锁获取,由 tryLock()实现;
与 无条件的 锁获取 相比,它具有更完善的错误恢复机制;
II、可定时、可轮询的锁获取,可以避免 死锁 的发生(在内部锁中,死锁是致命的,唯一的恢复方法是重启应用程序,构建程序时不允许出错);
III、对于实现那些 具有时间限制 的活动,定时锁同样非常有用;
1.3.5、可中断的锁获取
I、可中断的锁获取 允许 在可取消的活动中使用;
II、当你 正在响应中断的时候,lockInterrupter()能够使你获取锁,且 它是内置于 Lock的,不需要再创建其他种类不可中断的阻塞机制;
1.3.6、非块结构的锁
I、???
2、锁的性能
2.1、内部锁(synchronized) 与 显式锁(Lock) 的性能和可伸缩性 是基于平台的,比如:CPU、处理器数量、高速缓存大小、JVM特性...;
3、锁的公平性
3.1、ReentrantLock 构造函数 提供了 2种公平性的选择:
a,非公平锁(默认)
I、线程的请求可以 在等待线程的队列中向前跳跃,获得该锁;
II、线程只有当锁被占用时才会等待;
b,公平锁
I、如果锁已被线程占用,新的线程请求会加入到等待队列,线程必须 按顺序获取;
4、synchronized与ReentrantLock选择
4.1、在内部锁不能满足使用时,ReentrantLock才被作为更高级的工具;
4.2、当你需要以下高级特性时,才应该使用:
a,可定时、可轮询的锁获取;
b,可中断的锁获取;
c,公平队列;
d,非块结构的锁;
5、读写锁
5.1、ReentrantLock实现了标准的互斥锁(一次最多只有一个线程能够持有相同的lock);
5.2、互斥锁 过分地限制了并发性,避免了"写/写"、"写/读"、"读/读"操作;
读写锁 :一个资源可 被多个读者访问(或 被一个写者访问 [2者不能同时进行]);
5.3、jdk提供了 ReadWriteLock、ReentrantReadWriteLock:
a,ReentrantReadWriteLock 提供了 可重入的加锁语义;
b,ReentrantReadWriteLock 可被 构造为 非公平、公平锁:
公平锁:
选择权 交给 等待时间最长的线程;
如果 锁由读者获得,而 另一个线程请求写入锁,那么 不允许读者获得读取锁,直到 写者被受理,且已释放写入锁;
非公平锁:
线程运行访问的顺序不定;
由 写者降级为读者 允许的,读者升级为写者不允许;
c,ReentrantReadWriteLock 的 写入锁 有 唯一的所有者 , 且 只能被 获得了该锁的线程释放;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?