Semaphore分析

1.类声明

public class Semaphore implements java.io.Serializable {
}

2.依旧是主要委托Sync内部类实现

  • Sync抽象类
// 经典AQS实现版本
abstract static class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = 1192457210091910933L;

        Sync(int permits) { // 资源初始化
            setState(permits);
        }

        final int getPermits() { // 获得当前资源数
            return getState();
        }

        // 非公平方式获取许可,为什么要写在抽象类中,因为所有的tryAcquire方法都会直接以非公平方式
        // 尝试获取许可,无论初始化时使sync是公平还是非公平的。
        final int nonfairTryAcquireShared(int acquires) {
            for (;;) {  // cas减许可
                int available = getState();
                int remaining = available - acquires;
                // 如果剩余的数量小于0(共享模式下判断tryAcquireShared是看返回的整数是否小于0,小于0代表获取失败),代表获取许可失败,AQS中tryAcquire失败将会进队列等待。
                if (remaining < 0 ||
                    compareAndSetState(available, remaining))
                    return remaining;
            }
        }

        // cas释放许可,公平和非公平模式都一样
        protected final boolean tryReleaseShared(int releases) {
            for (;;) {
                int current = getState();
                int next = current + releases;
                if (next < current) // overflow
                    throw new Error("Maximum permit count exceeded");
                if (compareAndSetState(current, next)) // 没有条件判断,只要许可被加上去就返回true
                    return true;
            }
        }
        // 纯粹的cas减掉一部分许可
        final void reducePermits(int reductions) {
            for (;;) {
                int current = getState();
                int next = current - reductions;
                if (next > current) // underflow
                    throw new Error("Permit count underflow");
                if (compareAndSetState(current, next))
                    return;
            }
        }
        // 许可归零
        final int drainPermits() {
            for (;;) {
                int current = getState();
                if (current == 0 || compareAndSetState(current, 0))
                    return current;
            }
        }
    }
  • 非公平模式
static final class NonfairSync extends Sync {
        private static final long serialVersionUID = -2694183684443567898L;

        NonfairSync(int permits) {
            super(permits);
        }

        protected int tryAcquireShared(int acquires) {
            // 直接使用抽象类中的方法
            return nonfairTryAcquireShared(acquires);
        }
    }
  • 公平模式
static final class FairSync extends Sync {
        private static final long serialVersionUID = 2014338818796000944L;

        FairSync(int permits) {
            super(permits);
        }

        protected int tryAcquireShared(int acquires) {
            for (;;) {
                // 公平模式下将会先判断是否有线程在等待,在等待先排队
                if (hasQueuedPredecessors())
                    return -1;
                int available = getState();
                int remaining = available - acquires;
                if (remaining < 0 ||
                    compareAndSetState(available, remaining))
                    return remaining;
            }
        }
    }

3.具体的获取许可方法

// 获取许可直接委托sync
public void acquire() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,778评论 19 139
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 4,100评论 1 15
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,943评论 18 399
  • Chapter 3 Mental Representations - The Accidental Blindfo...
    UUfighting阅读 518评论 0 0
  • (1) 罗胖的罗辑思维节目中有一期请了黄执中代班,黄执中讲了一个简单故事: 假如你是一位美国士兵,你们排得到了一个...
    降龙18掌阅读 1,172评论 0 0

友情链接更多精彩内容