Java并发编程(2) AbstractQueuedSynchronizer的设计与实现 (2)

该方法将会调用重写的tryAcquireShare(int args)方法。

 
public final void acquireSharedInterruptibly(int arg)   与acquireInterruptibly方法相同  
public final boolean
releaseShared(int arg)
   共享式的释放同步状态

该方法会调用tryReleaseShared(int args)方法

 

  根据上面提供的方法,同步器主要提供两种模式:独占式和共享式。顾名思义,独占式表示同一时刻只有一个线程才会获取到同步状态,而其他线程都得等待;而共享式就允许同一时刻可以多个线程获取到同步状态。至于示例的话,大家可以查看源码类上注释的Mutx类,表示一个自定义的独占锁。下面我还是直接贴出示例代码。

Java并发编程(2) AbstractQueuedSynchronizer的设计与实现

Java并发编程(2) AbstractQueuedSynchronizer的设计与实现

class Mutex implements Lock, java.io.Serializable { // 内部类,自定义同步器 private static class Sync extends AbstractQueuedSynchronizer { // 是否处于占用状态 protected boolean isHeldExclusively() { return getState() == 1; } // 当状态为0的时候获取锁 public boolean tryAcquire(int acquires) { assert acquires == 1; // Otherwise unused if (compareAndSetState(0, 1)) { // 将当前线程设置为独占线程 setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; } // 释放锁,将状态设置为0 protected boolean tryRelease(int releases) { assert releases == 1; // 断言 if (getState() == 0) throw new IllegalMonitorStateException(); // 将线程或状态 重置为初始值 setExclusiveOwnerThread(null); setState(0); return true; } // 返回一个Condition,每个condition都包含了一个condition队列 Condition newCondition() { return new ConditionObject(); } } // 仅需要将操作代理到Sync上即可 private final Sync sync = new Sync(); public void lock() { sync.acquire(1); } public boolean tryLock() { return sync.tryAcquire(1); } public void unlock() { sync.release(1); } public Condition newCondition() { return sync.newCondition(); } public boolean isLocked() { return sync.isHeldExclusively(); } public boolean hasQueuedThreads() { return sync.hasQueuedThreads(); } public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(1); } public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException { return sync.tryAcquireNanos(1, unit.toNanos(timeout)); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyffx.html