没有合适的资源?快使用搜索试试~ 我知道了~
Java 多线程与并发(11-26)-JUC锁- ReentrantLock详解.pdf
0 下载量 156 浏览量
2023-07-26
17:17:12
上传
评论
收藏 454KB PDF 举报
温馨提示
试读
14页
Java 多线程与并发(11_26)-JUC锁_ ReentrantLock详解
资源推荐
资源详情
资源评论
Java
多
线
程
与
并
发
(11/26)-JUC
锁
:
ReentrantLock
详
解
JUC
锁
:ReentrantLock
详
解
可
重
⼊
锁
ReentrantLock
的
底
层
是
通过
AbstractQueuedSynchronizer
实
现
,
所
以
先
要
学
习上⼀
章
节
AbstractQueuedSynchronizer
详
解
。
•
JUC
锁
:ReentrantLock
详
解
◦
带
着
BAT
⼤
⼚
的
⾯
试
问
题
去
理
解
◦
ReentrantLock
源
码
分
析
▪
类
的
继
承
关
系
▪
类
的
内
部
类
▪
类
的
属
性
▪
类
的
构
造
函
数
▪
核
⼼
函
数
分
析
◦
⽰
例
分
析
▪
公
平
锁
◦
参
考
⽂
章
带
着
BAT
⼤
⼚
的
⾯
试
问
题
去
理
解
提
⽰
请
带
着
这
些
问
题
继续
后
⽂
,
会
很
⼤
程
度
上
帮
助
你
更
好
的
理
解
相
关
知
识
点
。
•
什么
是
可
重
⼊
,
什么
是
可
重
⼊
锁
?
它
⽤
来
解
决
什么
问
题
?
•
ReentrantLock
的
核
⼼
是
AQS
,
那
么
它
怎
么
来
实
现
的
,
继
承
吗
?
说说
其
类
内
部
结
构
关
系
。
•
ReentrantLock
是
如
何
实
现
公
平
锁
的
?
•
ReentrantLock
是
如
何
实
现
⾮
公
平
锁
的
?
•
ReentrantLock
默
认
实
现
的
是
公
平
还
是
⾮
公
平
锁
?
•
使
⽤
ReentrantLock
实
现
公
平
和
⾮
公
平
锁
的
⽰
例
?
•
ReentrantLock
和
Synchronized
的
对
⽐
?
ReentrantLock
源
码
分
析
类
的
继
承
关
系
ReentrantLock
实
现
了
Lock
接
⼝
,
Lock
接
⼝
中
定
义了
lock
与
unlock
相
关
操
作
,
并
且
还
存
在
newCondition
⽅
法
,
表
⽰
⽣
成
⼀个
条
件
。
public class ReentrantLock implements Lock, java.io.Serializable
1
类
的
内
部
类
ReentrantLock
总
共
有
三个
内
部
类
,
并
且三个
内
部
类
是
紧
密
相
关
的
,
下
⾯
先
看
三个
类
的
关
系
。
说
明
:ReentrantLock
类
内
部
总
共
存
在
Sync
、
NonfairSync
、
FairSync
三个
类
,
NonfairSync
与
FairSync
类
继
承
⾃
Sync
类
,
Sync
类
继
承
⾃
AbstractQueuedSynchronizer
抽
象
类
。
下
⾯
逐
个
进
⾏
分
析
。
•
Sync
类
Sync
类
的
源
码
如
下
:
abstract static class Sync extends AbstractQueuedSynchronizer {
//
序
列
号
private static final long serialVersionUID = -5179523762034025860L;
//
获
取
锁
abstract void lock();
//
⾮
公
平
⽅
式
获
取
final boolean nonfairTryAcquire(int acquires) {
//
当
前
线
程
final Thread current = Thread.currentThread();
1
2
3
4
5
6
7
8
9
10
11
//
获
取
状
态
int c = getState();
if (c == 0) {
//
表
⽰
没
有
线
程
正
在
竞
争
该
锁
if (compareAndSetState(0, acquires)) {
//
⽐
较
并
设
置
状
态
成
功
,
状
态
0
表
⽰
锁
//
设
置
当
前
线
程
独
占
setExclusiveOwnerThread(current);
return true;
//
成
功
}
}
else if (current == getExclusiveOwnerThread()) {
//
当
前
线
程
拥
有
该
锁
int nextc = c + acquires;
//
增
加
重
⼊
次
数
if (nextc < 0)
// overflow
throw new Error("Maximum lock count exceeded");
//
设
置
状
态
setState(nextc);
//
成
功
return true;
}
//
失
败
return false;
}
//
试
图在
共
享
模
式
下
获
取
对
象
状
态
,
此
⽅
法
应
该
查
询
是
否
允
许
它
在
共
享
模
式
下
获
取
对
象
状
态
,
如
果
protected final boolean tryRelease(int releases) {
int c = getState() - releases;
if (Thread.currentThread() != getExclusiveOwnerThread())
//
当
前
线
程
不为
独
throw new IllegalMonitorStateException();
//
抛
出
异
常
//
释
放
标
识
boolean free = false;
if (c == 0) {
free = true;
//
已
经
释
放
,
清
空
独
占
setExclusiveOwnerThread(null);
}
//
设
置
标
识
setState(c);
return free;
}
//
判
断
资
源
是
否
被
当
前
线
程
占
有
protected final boolean isHeldExclusively() {
// While we must in general read state before owner,
// we don't need to do so to check if current thread is owner
return getExclusiveOwnerThread() == Thread.currentThread();
}
//
新
⽣
⼀个
条
件
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
剩余13页未读,继续阅读
资源评论
weishaoonly
- 粉丝: 132
- 资源: 1383
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功