自定义同步组件(锁)

来源:互联网 发布:床上用品 知乎 编辑:程序博客网 时间:2024/05/20 00:50
import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.AbstractQueuedSynchronizer;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;/** *  * 作为锁(自定义同步组件)的使用者,在使用锁时并不会和内部的同步器打交道,通常是调用锁提供的方法。 * @author gaoyi * @date 2017-06-20 * */public class Mutex implements Lock{//自定义同步器private static class Sync extends AbstractQueuedSynchronizer {protected boolean isHeldExclusively() {return getState() == 1;}public boolean tryAcquire(int acquires) {if(compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}protected boolean tryRelease(int releases) {if(getState() == 0)throw new IllegalMonitorStateException();setExclusiveOwnerThread(null);setState(0);return true;}Condition getCondition() {return new ConditionObject();}}private final Sync sync = new Sync();@Overridepublic void lock() {sync.acquire(1);}@Overridepublic void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);}@Overridepublic boolean tryLock() {return sync.tryAcquire(1);}@Overridepublic boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return sync.tryAcquire(1);}@Overridepublic void unlock() {sync.release(1);}@Overridepublic Condition newCondition() {return sync.getCondition();}}


说明:队列同步器,是用来构建锁或者其他同步组件的基础框架,是实现大部分同步需求的基础。



原创粉丝点击