读写锁学习笔记

1、数据结构

读锁是共享模式,写锁是独占模式,两个锁也公用一个AQS

两者共用一个state来表示,state前16位表示读锁,后16位表示写锁

读锁操作

通过向右位移16位,然后进行操作

写锁操作

通过和0000 0000 0000 0000 1111 1111 1111 1111与运算,就可以得到后面16位

由于16位最大全1表示为65535,所以读锁和写锁最多可以获取65535个

2、写锁

获取

代码

逻辑

释放

代码

逻辑

3、读锁

加锁

代码

逻辑

解锁

代码

逻辑

4、锁降级

概念

锁降级其实就是一种特殊的重入机制,也就是写锁变成读锁的一个过程,虽然写锁和读写实际上并没有高低级之分

实现方式

先获取写入锁,然后获取读取锁,最后释放写锁。但是,从读取锁升级到写入锁是不可能的

原因

一派(主流)的描述:没有感知到数据变化的写锁冲进来会继续占用写锁,阻塞已完成写操作的线程去继续获取读锁,修改了数据导致已完成写操作的线程感受不到数据被修改了

二派的描述:为了性能,因为读锁的抢占必将引起资源分配和判断等操作,降级锁减少了线程的阻塞唤醒,实时连续性更强

5、理解

1、读锁和写锁都能重入

2、读读不互斥、读写互斥、写写互斥

3、写锁阻塞写之后的读写锁,但是不阻塞写锁之前的读锁线程

相关推荐

  1. C++

    2024-02-21 17:06:02       45 阅读
  2. python文件学习笔记

    2024-02-21 17:06:02       35 阅读
  3. 关于Redission

    2024-02-21 17:06:02       37 阅读
  4. 乐观、悲观、互斥

    2024-02-21 17:06:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-21 17:06:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-21 17:06:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-21 17:06:02       82 阅读
  4. Python语言-面向对象

    2024-02-21 17:06:02       91 阅读

热门阅读

  1. ADO.NET查询返回单个值

    2024-02-21 17:06:02       50 阅读
  2. 抽象方法与设计模式

    2024-02-21 17:06:02       47 阅读
  3. Qt之QChar类的数据转换

    2024-02-21 17:06:02       52 阅读
  4. Promise

    2024-02-21 17:06:02       53 阅读
  5. C#是什么?可以用来做什么?

    2024-02-21 17:06:02       59 阅读
  6. 备份服务器数据的重要

    2024-02-21 17:06:02       56 阅读