首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Java并发编程-AbstractQueuedSynchronizer源码分析(3)

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为例子,详细分析以下同步器的实现逻辑。
返回列表