没有合适的资源?快使用搜索试试~ 我知道了~
Java 多线程与并发(12-26)-JUC锁- ReentrantReadWriteLock详解.pdf
0 下载量 133 浏览量
2023-07-26
18:24:28
上传
评论
收藏 451KB PDF 举报
温馨提示
试读
18页
Java 多线程与并发(12_26)-JUC锁_ ReentrantReadWriteLock详解
资源推荐
资源详情
资源评论
Java
多
线
程
与
并
发
(12/26)-JUC
锁
:
ReentrantReadWriteLock
详
解
JUC
锁
:ReentrantReadWriteLock
详
解
ReentrantReadWriteLock
表
⽰
可
重
⼊
读
写
锁
,
ReentrantReadWriteLock
中
包
含
了两
种
锁
,
读
锁
ReadLock
和
写
锁
WriteLock
,
可
以
通过这
两
种
锁
实
现
线
程
间
的
同
步
。
带
着
BAT
⼤
⼚
的
⾯
试
问
题
去
理
解
提
⽰
请
带
着
这
些
问
题
继续
后
⽂
,
会
很
⼤
程
度
上
帮
助
你
更
好
的
理
解
相
关
知
识
点
•
为了
有
了
ReentrantLock
还
需
要
ReentrantReadWriteLock?
•
ReentrantReadWriteLock
底
层
实
现
原
理
?
•
ReentrantReadWriteLock
底
层
读
写
状
态
如
何
设计
的
?
⾼
16
位
为
读
锁
,
低
16
位
为
写
锁
•
读
锁
和
写
锁
的
最
⼤
数
量
是
多
少
?
•
本
地
线
程
计
数
器
ThreadLocalHoldCounter
是
⽤
来
做
什么
的
?
•
缓
存
计
数
器
HoldCounter
是
⽤
来
做
什么
的
?
•
写
锁
的
获
取
与
释
放
是
怎
么
实
现
的
?
•
读
锁
的
获
取
与
释
放
是
怎
么
实
现
的
?
•
RentrantReadWriteLock
为什么不
⽀
持
锁
升
级
?
•
什么
是
锁
的
升
降
级
?RentrantReadWriteLock
为什么不
⽀
持
锁
升
级
?
ReentrantReadWriteLock
数
据
结
构
ReentrantReadWriteLock
底
层
是
基
于
ReentrantLock
和
AbstractQueuedSynchronizer
来
实
现
的
,
所
以
,
ReentrantReadWriteLock
的
数
据
结
构
也
依
托
于
AQS
的
数
据
结
构
。
ReentrantReadWriteLock
源
码
分
析
类
的
继
承
关
系
public class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializab
1
说
明
:
可
以
看
到
,
ReentrantReadWriteLock
实
现
了
ReadWriteLock
接
⼝
,
ReadWriteLock
接
⼝
定
义了
获
取
读
锁
和
写
锁
的
规
范
,
具
体
需
要
实
现
类
去
实
现
;
同
时
其
还
实
现
了
Serializable
接
⼝
,
表
⽰
可
以
进
⾏
序
列
化
,
在
源
代
码
中
可
以
看
到
ReentrantReadWriteLock
实
现
了
⾃
⼰
的
序
列
化
逻
辑
。
类
的
内
部
类
ReentrantReadWriteLock
有
五个
内
部
类
,
五个
内
部
类
之
间
也
是
相
互
关
联
的
。
内
部
类
的
关
系
如
下
图
所
⽰
。
说
明
:
如
上
图
所
⽰
,
Sync
继
承
⾃
AQS
、
NonfairSync
继
承
⾃
Sync
类
、
FairSync
继
承
⾃
Sync
类
;
ReadLock
实
现
了
Lock
接
⼝
、
WriteLock
也
实
现
了
Lock
接
⼝
。
内
部
类
-Sync
类
•
类
的
继
承
关
系
abstract static class Sync extends AbstractQueuedSynchronizer {}
1
说
明
:Sync
抽
象
类
继
承
⾃
AQS
抽
象
类
,
Sync
类
提
供
了
对
ReentrantReadWriteLock
的
⽀
持
。
•
类
的
内
部
类
Sync
类
内
部
存
在
两个
内
部
类
,
分别
为
HoldCounter
和
ThreadLocalHoldCounter
,
其
中
HoldCounter
主
要
与
读
锁
配
套
使
⽤
,
其
中
,
HoldCounter
源
码
如
下
。
//
计
数
器
static final class HoldCounter {
//
计
数
int count = 0;
// Use id, not reference, to avoid garbage retention
1
2
3
4
5
//
获
取
当
前
线
程
的
TID
属
性
的
值
final long tid = getThreadId(Thread.currentThread());
}
6
7
8
说
明
:HoldCounter
主
要
有
两个
属
性
,
count
和
tid
,
其
中
count
表
⽰
某
个
读
线
程
重
⼊
的
次
数
,
tid
表
⽰
该
线
程
的
tid
字
段
的
值
,
该
字
段
可
以
⽤
来
唯
⼀
标
识
⼀个
线
程
。
ThreadLocalHoldCounter
的
源
码
如
下
//
本
地
线
程
计
数
器
static final class ThreadLocalHoldCounter
extends ThreadLocal<HoldCounter> {
//
重
写
初
始
化
⽅
法
,
在
没
有
进
⾏
set
的
情
况
下
,
获
取
的
都
是
该
HoldCounter
值
public HoldCounter initialValue() {
return new HoldCounter();
}
}
1
2
3
4
5
6
7
8
说
明
:ThreadLocalHoldCounter
重
写
了
ThreadLocal
的
initialValue
⽅
法
,
ThreadLocal
类
可
以
将
线
程
与
对
象
相
关
联
。
在
没
有
进
⾏
set
的
情
况
下
,
get
到
的
均
是
initialValue
⽅
法
⾥
⾯
⽣
成
的
那
个
HolderCounter
对
象
。
•
类
的
属
性
abstract static class Sync extends AbstractQueuedSynchronizer {
//
版
本
序
列
号
private static final long serialVersionUID = 6317671515068378041L;
//
⾼
16
位
为
读
锁
,
低
16
位
为
写
锁
static final int SHARED_SHIFT = 16;
//
读
锁
单
位
static final int SHARED_UNIT = (1 << SHARED_SHIFT);
//
读
锁
最
⼤
数
量
static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1;
//
写
锁
最
⼤
数
量
static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;
//
本
地
线
程
计
数
器
private transient ThreadLocalHoldCounter readHolds;
//
缓
存
的
计
数
器
private transient HoldCounter cachedHoldCounter;
//
第
⼀个
读
线
程
private transient Thread firstReader = null;
//
第
⼀个
读
线
程
的
计
数
private transient int firstReaderHoldCount;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
说
明
:
该
属
性
中
包
括
了
读
锁
、
写
锁
线
程
的
最
⼤
量
。
本
地
线
程
计
数
器
等
。
•
类
的
构
造
函
数
Sync() {
readHolds = new ThreadLocalHoldCounter();setState(getState());
}
1
2
3
4
说
明
:
在
Sync
的
构
造
函
数
中
设
置
了
本
地
线
程
计
数
器
和
AQS
的
状
态
state
。
内
部
类
-Sync
核
⼼
函
数
分
析
对
ReentrantReadWriteLock
对
象
的
操
作
绝
⼤多
数
都
转
发
⾄
Sync
对
象
进
⾏
处
理
。
下
⾯
对
Sync
类
中
的
重
点
函
数
进
⾏
分
析
•
sharedCount
函
数
表
⽰
占
有
读
锁
的
线
程
数
量
,
源
码
如
下
static int sharedCount(int c) { return c >>> SHARED_SHIFT; }
1
说
明
:
直
接
将
state
右
移
16
位
,
就
可
以
得
到
读
锁
的
线
程
数
量
,
因
为
state
的
⾼
16
位
表
⽰
读
锁
,
对
应
的
低
⼗
六
位
表
⽰
写
锁
数
量
。
•
exclusiveCount
函
数
表
⽰
占
有
写
锁
的
线
程
数
量
,
源
码
如
下
static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }
1
说
明
:
直
接
将
状
态
state
和
(2^16-1)
做
与
运
算
,
其
等
效
于
将
state
模
上
2^16
。
写
锁
数
量
由
state
的
低
⼗
六
位
表
⽰
。
•
tryRelease
函
数
/*
* Note that tryRelease and tryAcquire can be called by
* Conditions. So it is possible that their arguments contain
* both read and write holds that are all released during a
* condition wait and re-established in tryAcquire.
*/
1
2
3
4
5
6
剩余17页未读,继续阅读
资源评论
weishaoonly
- 粉丝: 132
- 资源: 1383
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功