13_显式锁

显式锁

一、内置锁的局限

  • 无法中断一个正在等待内置锁的线程
  • 无法实现非阻塞结构的加锁规则
  • 无法实现公平性的锁等待

二、显示锁

2.1 显示锁概念

  • 提供了无条件的、可轮询的、定时的、可中断的锁获取操作
  • 加锁和解锁都是显式的
  • 提供了与内置锁相同的内存可见性语义
  • 在加锁语义、调度算法、顺序保证、性能特性等方面可能有所不同
  • 必须在 finally 块中释放

2.2 轮询锁和定时锁

  • 可定时和可轮询的锁获取模式,是由 tryLock 方法实现
  • 可定时和可轮询的锁获取可避免死锁的发生

2.3 可中断的锁获取

  • 可中断的锁获取模式,是由 lockInterruptibly 方法实现

2.4 非块结构的加锁

  • 内置锁模式,锁的获取和释放都是基于代码块的
  • 显示锁模式,可以用于对非块结构加锁,比如锁分段技术、连锁式加锁等

2.5 公平性

  • 公平性是指,在等待锁的线程中,线程获取锁的顺序是不变的
  • 显示锁,提供了公平性的锁获取方式
  • 在大多数情况下,非公平锁的性能要高于公平锁的性能
  • 非公平性性能高的原因是:恢复一个挂起的线程与该线程真正开始运行之间,存在着严重的延迟

比如说,唤醒挂起线程时间点在 10ms,但是挂起线程真正开始执行时间点则是在 1000ms,时间间隔达到 990ms 之久,这2个时间点之间就存在很大的时间空隙,实际上可以先运行其他线程。

三、读写锁

互斥模式:

  • 内置锁和显示锁采用的都是互斥锁模式,每次只能有一个线程拥有锁
  • 互斥锁是一种强硬的加锁规则,限制了并发性

读写分离模式:

  • 在许多情况下,多线程的读操作是可以并发执行的,无需加互斥锁
  • 读写锁将读锁和写锁分离,多个线程可以同时读锁,不会互斥

四、锁的选择

  • 优先选择内置锁
  • 需要高级功能时,再选择显示锁,高级功能包括:
    • 可定时的锁
    • 可轮询非阻塞的锁获取
    • 可中断的锁获取
    • 公平锁模式
    • 非块结构的加锁
  • 在读多写少的情况下,为了提高并发性,可以考虑使用读写锁
作者

jiaduo

发布于

2022-05-15

更新于

2023-04-03

许可协议