您的位置:首页 > 文旅 > 美景 > 84-java AQS共享资源的方式

84-java AQS共享资源的方式

2024/11/8 16:24:06 来源:https://blog.csdn.net/weixin_41775999/article/details/142170764  浏览:    关键词:84-java AQS共享资源的方式

在Java中,AQS(AbstractQueuedSynchronizer)是实现同步器的基础框架,它提供了一种实现锁和同步工具的方式AQS通过使用一个FIFO队列来管理多线程的竞争,它是许多同步器(如ReentrantLock、Semaphore、CountDownLatch等)的基础。

AQS通过内部类Node实现了一个CLH锁队列,用于存储等待获取资源的线程。Node是一个双向链表节点,包含了线程、节点状态以及前后指针。

以下是一个简单的自定义同步器示例,它使用AQS来管理共享资源:

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class CustomSync extends AbstractQueuedSynchronizer {// 使用AtomicInteger作为共享资源private AtomicInteger state;protected CustomSync(int initialState) {state = new AtomicInteger(initialState);}// 尝试获取共享资源@Overrideprotected boolean tryAcquire(int arg) {int current = state.get();return state.compareAndSet(current, current - 1);}// 尝试释放共享资源@Overrideprotected boolean tryRelease(int arg) {int current = state.get();return state.compareAndSet(current, current + 1);}// 查询当前共享资源的状态@Overrideprotected boolean isHeldExclusively() {return state.get() == 0;}
}

在这个示例中,我们定义了一个简单的自定义同步器CustomSync,它使用一个AtomicInteger作为共享资源,并重写了tryAcquire和tryRelease方法来尝试获取和释放资源。isHeldExclusively方法用于查询当前同步器是否被独占。

AQS提供了一种清晰的方式来定义如何获取和释放共享资源,以及如何管理等待线程的队列。通过这种方式,开发者可以创建出具有高度可伸缩性和灵活性的同步工具。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com