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、写锁阻塞写之后的读写锁,但是不阻塞写锁之前的读锁线程