Java并发编程-AbstractQueuedSynchronizer源码分析(3)
- UID
- 1066743
|
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 unused11 if (compareAndSetState(0, 1)) {12 setExclusiveOwnerThread(Thread.currentThread());13 return true;14 }15 return false;16 }17 // 释放锁,将状态设置为018 protected boolean tryRelease(int releases) {19 assert releases == 1; // Otherwise unused20 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为例子,详细分析以下同步器的实现逻辑。 |
|
|
|
|
|