欢迎光临散文网 会员登陆 & 注册

AQS框架了解过吗?具体是干嘛的?

2023-04-12 16:00 作者:云和数据何老师  | 我要投稿


AQS(AbstractQueuedSynchronizer)是Java中用于构建同步器的框架,它提供了一种实现各种同步器的通用框架,例如ReentrantLock、Semaphore、CountDownLatch等等。

AQS框架的核心思想是使用一个双向链表来维护等待线程队列,同时使用一个状态变量来表示当前同步器的状态。当线程请求获取同步器的锁时,如果同步器已经被占用,那么线程就会被加入等待队列中,并阻塞自己,等待被唤醒;如果同步器未被占用,则线程直接获取同步器的锁,并将同步器的状态设置为“已占用”。

 

下面是一个简单的示例,演示了如何使用 AQS 框架来实现一个简单的计数器:

import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class Counter {    private final Sync sync = new Sync();    public void increment() {        sync.acquire(1);        try {            // 进行计数器加一操作        } finally {            sync.release(1);        }    }    public int getCount() {        return sync.getCount();    }    private static class Sync extends AbstractQueuedSynchronizer {        private static final long serialVersionUID = 1L;        protected boolean tryAcquire(int arg) {            return compareAndSetState(0, arg);        }        protected boolean tryRelease(int arg) {            int c = getState() - arg;            if (c == 0) {                return true;            }            if (c < 0) {                throw new IllegalStateException("Counter underflow");            }            setState(c);            return false;        }        public int getCount() {            return getState();        }    }}

在上面的示例中,Counter类包含一个Sync类的实例,它继承了AbstractQueuedSynchronizer并实现了 tryAcquire()、tryRelease()方法。increment()方法首先尝试获取同步器的锁(即调用 acquire() 方法),然后进行计数器加一操作,最后释放同步器的锁(即调用release() 方法)。getCount()方法返回当前计数器的值,即同步器的状态。


AQS框架了解过吗?具体是干嘛的?的评论 (共 条)

分享到微博请遵守国家法律