AQS 应用 —— 手写 Semaphore、CountDownLatch

本文介绍了AQS(AbstractQueuedSynchronizer)的基本概念,并通过手写Semaphore和CountDownLatch的实现,详细阐述了如何利用AQS进行同步控制。Semaphore用于控制并发访问的线程数量,而CountDownLatch则用于等待多个线程完成特定任务。通过重写AQS的获取和释放锁方法,可以轻松实现这两者的核心功能。
摘要由CSDN通过智能技术生成

1 AQS 简介

  • AQS 为抽象锁队列,它内部引入了一个锁队列,并实现了获取锁队列失败后线程的入队列操作和成功释放锁后,唤醒队列下一个节点线程的出队列操作
  • AQS 也提供了获取和释放锁的模板,子类只要实现获取/释放锁(tryAcquire/tryRelease)的逻辑,就可以实现一个完成的锁,如 ReentrantLock、ReentrantReadWriteLock
  • AQS、ReentrantLock、ReentrantReadWriteLock 结构与源码分析 一文中 分析了AQS 的结构

2 Semaphore 简介

  • 需求分析:一个旅游景区,当人数达到额定值时,就不能在放入进去了,出来一个人才能进去一个人
  • 概要设计:AQS 正好可以实现上面的需求
    • 可将 state 变量设为额定值(state 表示剩余的可获取的资源)
    • 当一个线程获取锁成功后,将 state - 1。释放锁成功后,将 state + 1
    • 当 state < = 0 时,表示没有资源了,获取资源的线程将被挂起
2.1 Semaphore 设计
  • 以下即是最简洁的 Semaphore 所需要的核心代码,自己实现的仅仅只有 tryAcquireShared()、tryReleaseShared()。其余的部分都被 AQS 实现了,可见 AQS 的强大。
public class MySemaphore {
   
    private Sync sync;
    public MySemaphore(int permits) {
   
        this.sync = new Sync(permits);
    }
    //我觉得不应该响应中断,因为被中断的锁显然没有获取到锁,这时就会走 finally 中的 release() 方法来释放锁,这样就可能会抛 error 错误了
    public void acquire() {
   sync.acquireShared(1);}
    public void release() {
   sync.releaseShared(1);}
    static class 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值