独占锁的示例

/** * 实现一个独占锁 */public class Mutex implements Lock {    private static class Sync extends AbstractQueuedSynchronizer{        //是否是独占        protected boolean isHeldExclusively(){            return getState() == 1;        }        //独占式只反对1个acquires        public boolean tryAcquire(int acquires){            if(compareAndSetState(0,1)){                setExclusiveOwnerThread(Thread.currentThread());                return true;            }            return false;        }        //开释锁        protected boolean tryRelease(int release){            if(getState() == 0){                throw new IllegalMonitorStateException();            }            setExclusiveOwnerThread(null);            setState(0);            return true;        }        Condition newCondition(){            return new ConditionObject();        }    }    private final Sync sync = new Sync();    @Override    public void lock() {        sync.acquire(1);    }    @Override    public void lockInterruptibly() throws InterruptedException {        sync.acquireInterruptibly(1);    }    @Override    public boolean tryLock() {        return sync.tryAcquire(1);    }    @Override    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {        return sync.tryAcquireNanos(1,unit.toNanos(time));    }    @Override    public void unlock() {        sync.release(1);    }    @Override    public Condition newCondition() {        return sync.newCondition();    }    //是否是独占锁    public boolean isLock(){        return sync.isHeldExclusively();    }    public boolean hasQueuedThreads(){        return sync.hasQueuedThreads();    }}

示例中通过实现Lock接口,而后应用一个外部类继承AbstractQueuedSynchronizer来实现一个独占锁。

共享锁示例

/** * 共享锁示例 */public class SharedLockInstance implements Lock {    private final Sync sync = new Sync(2);    public LockInstance() throws IllegalAccessException {    }    //通过匿名外部类能够保障Sync单例    private static final class Sync extends AbstractQueuedSynchronizer{        Sync(int state) throws IllegalAccessException {            if(state <= 0){                throw new IllegalAccessException("count must large than 0");            }            setState(state);        }        @Override        public int tryAcquireShared(int arg){            for(;;){                System.out.println("try acquire...");                int current = getState();                int now = current - arg;                if(now < 0 || compareAndSetState(current,now)){                    return now;                }            }        }        @Override        public boolean tryReleaseShared(int arg){            for(;;){                System.out.println("try release...");                int current = getState();                int now = current + arg;                if(compareAndSetState(current,now)){                    return true;                }            }        }        Condition newCondition(){            return new ConditionObject();        }    }    @Override    public void lock() {        sync.acquireShared(1);    }    @Override    public void lockInterruptibly() throws InterruptedException {        sync.acquireInterruptibly(1);    }    @Override    public boolean tryLock() {        return sync.tryAcquireShared(1) >= 0;    }    @Override    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {        return sync.tryAcquireSharedNanos(1,unit.toNanos(time));    }    @Override    public void unlock() {        sync.tryReleaseShared(1);    }    @Override    public Condition newCondition() {        return sync.newCondition();    }}

不论是独占式锁还是共享锁都是在通过继承了AQS里的模板办法,这些模板办法大抵分3类:独占式获取与开释同步状态,共享式获取与开释同步状态和查问同步队列中的期待线程状况。