标题:
Java并发编程-AbstractQueuedSynchronizer源码分析(3)
[打印本页]
作者:
look_w
时间:
2019-1-17 19:20
标题:
Java并发编程-AbstractQueuedSynchronizer源码分析(3)
示例下面通过一个排它锁的例子来深入理解一下同步器的工作原理,而只有掌握同步器的工作原理才能够更加深入了解其他的并发组件。
排他锁的实现,一次只能一个线程获取到锁。
[url=]
[/url]
01
class
Mutex
implements
Lock, java.io.Serializable {
02
//
内部类,自定义同步器
03
private
static
class
Sync
extends
AbstractQueuedSynchronizer {
04
//
是否处于占用状态
05
protected
boolean
isHeldExclusively() {
06
return
getState() == 1
;
07
}
08
//
当状态为0的时候获取锁
09
public
boolean
tryAcquire(
int
acquires) {
10
assert
acquires == 1;
//
Otherwise unused
11
if
(compareAndSetState(0, 1
)) {
12
setExclusiveOwnerThread(Thread.currentThread());
13
return
true
;
14
}
15
return
false
;
16
}
17
//
释放锁,将状态设置为0
18
protected
boolean
tryRelease(
int
releases) {
19
assert
releases == 1;
//
Otherwise unused
20
if
(getState() == 0)
throw
new
IllegalMonitorStateException();
21 setExclusiveOwnerThread(
null
);
22 setState(0
);
23
return
true
;
24
}
25
//
返回一个Condition,每个condition都包含了一个condition队列
26 Condition newCondition() {
return
new
ConditionObject(); }
27
}
28
//
仅需要将操作代理到Sync上即可
29
private
final
Sync sync =
new
Sync();
30
public
void
lock() { sync.acquire(1
); }
31
public
boolean
tryLock() {
return
sync.tryAcquire(1
); }
32
public
void
unlock() { sync.release(1
); }
33
public
Condition newCondition() {
return
sync.newCondition(); }
34
public
boolean
isLocked() {
return
sync.isHeldExclusively(); }
35
public
boolean
hasQueuedThreads() {
return
sync.hasQueuedThreads(); }
36
public
void
lockInterruptibly()
throws
InterruptedException {
37 sync.acquireInterruptibly(1
);
38
}
39
public
boolean
tryLock(
long
timeout, TimeUnit unit)
40
throws
InterruptedException {
41
return
sync.tryAcquireNanos(1
, unit.toNanos(timeout));
42
}
43 }[url=]
[/url]
可以看到Mutex将Lock接口均代理给了同步器的实现。
使用方将Mutex构造出来之后,调用lock获取锁,调用unlock进行解锁。下面以Mutex为例子,详细分析以下同步器的实现逻辑。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0