千家信息网

如何基于AQS写CountDownLatch

发表于:2024-10-31 作者:千家信息网编辑
千家信息网最后更新 2024年10月31日,这期内容当中小编将会给大家带来有关如何基于AQS写CountDownLatch,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。import java.util.con
千家信息网最后更新 2024年10月31日如何基于AQS写CountDownLatch

这期内容当中小编将会给大家带来有关如何基于AQS写CountDownLatch,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.AbstractQueuedSynchronizer;/** * Created by yzy on 2018/10/31. */public class MyCountDownLatch {    /**     * Synchronization control For CountDownLatch.     * Uses AQS state to represent count.     */    private static final class Sync extends AbstractQueuedSynchronizer {        private static final long serialVersionUID = 4982264981922014374L;        Sync(int count) {            setState(count);        }        int getCount() {            return getState();        }        @Override        protected int tryAcquireShared(int acquires) {            return (getState() == 0) ? 1 : -1;        }        @Override        protected boolean tryReleaseShared(int releases) {            // Decrement count; signal when transition to zero            for (;;) {                int c = getState();                if (c == 0)                    return false;                int nextc = c-1;                if (compareAndSetState(c, nextc))                    return nextc == 0;            }        }    }    private final Sync sync;    public MyCountDownLatch(int count) {        if (count < 0) throw new IllegalArgumentException("count < 0");        this.sync = new Sync(count);    }    public void await() throws InterruptedException {        sync.acquireSharedInterruptibly(1);    }    public boolean await(long timeout, TimeUnit unit)            throws InterruptedException {        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));    }    public void countDown() {        sync.releaseShared(1);    }    public long getCount() {        return sync.getCount();    }    public String toString() {        return super.toString() + "[Count = " + sync.getCount() + "]";    }}

上述就是小编为大家分享的如何基于AQS写CountDownLatch了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

0