13_显式锁
显式锁
一、内置锁的局限
- 无法中断一个正在等待内置锁的线程
- 无法实现非阻塞结构的加锁规则
- 无法实现公平性的锁等待
二、显示锁
2.1 显示锁概念
- 提供了无条件的、可轮询的、定时的、可中断的锁获取操作
- 加锁和解锁都是显式的
- 提供了与内置锁相同的内存可见性语义
- 在加锁语义、调度算法、顺序保证、性能特性等方面可能有所不同
- 必须在 finally 块中释放
2.2 轮询锁和定时锁
- 可定时和可轮询的锁获取模式,是由 tryLock 方法实现
- 可定时和可轮询的锁获取可避免死锁的发生
2.3 可中断的锁获取
- 可中断的锁获取模式,是由 lockInterruptibly 方法实现
2.4 非块结构的加锁
- 内置锁模式,锁的获取和释放都是基于代码块的
- 显示锁模式,可以用于对非块结构加锁,比如锁分段技术、连锁式加锁等
2.5 公平性
- 公平性是指,在等待锁的线程中,线程获取锁的顺序是不变的
- 显示锁,提供了公平性的锁获取方式
- 在大多数情况下,非公平锁的性能要高于公平锁的性能
- 非公平性性能高的原因是:恢复一个挂起的线程与该线程真正开始运行之间,存在着严重的延迟
比如说,唤醒挂起线程时间点在 10ms,但是挂起线程真正开始执行时间点则是在 1000ms,时间间隔达到 990ms 之久,这2个时间点之间就存在很大的时间空隙,实际上可以先运行其他线程。
三、读写锁
互斥模式:
- 内置锁和显示锁采用的都是互斥锁模式,每次只能有一个线程拥有锁
- 互斥锁是一种强硬的加锁规则,限制了并发性
读写分离模式:
- 在许多情况下,多线程的读操作是可以并发执行的,无需加互斥锁
- 读写锁将读锁和写锁分离,多个线程可以同时读锁,不会互斥
四、锁的选择
- 优先选择内置锁
- 需要高级功能时,再选择显示锁,高级功能包括:
- 可定时的锁
- 可轮询非阻塞的锁获取
- 可中断的锁获取
- 公平锁模式
- 非块结构的加锁
- 在读多写少的情况下,为了提高并发性,可以考虑使用读写锁