并发编程-Semaphore信号量

上一篇 <<<CountDownLatch同步计数器
下一篇 >>>CyclicBarrier屏障


工作原理

a.可以设置Semaphore信号量的 状态state值为5
b.当一个线程获取到锁的情况下,将state-1,锁释放成功之后state+1;
c.当state<0,表示没锁的资源,则当前线程阻塞。

  • 计数信号量-Semaphore
  • 多个线程竞争获取许可信号,申请到的做好自己的事情后归还,超过阈值后,线程申请许可信号将会被阻塞
  • new Semaphore(3); 总资源数
  • wc.acquire();申请资源
  • wc.release(); 释放资源

基于AQS手写Semaphore核心代码

/**
 * 构造函数设置aqs的state
 * @param count state值
 */
public MySemaphore(int count) {
    this.sync = new Sync(count);
}

/**
 * 重写阻塞的条件,分为公平和非公平,这里只考虑非公平
 * 默认设置了state,当有执行的时候,state就会减少,一旦小于0就阻塞,不让继续执行
 * @param acquires
 * @return
 */
@Override
protected int tryAcquireShared(int acquires) {
    for (;;) {
        int available = getState();
        int remaining = available - acquires;
        if (remaining < 0 ||
                compareAndSetState(available, remaining)) {
            return remaining;
        }
    }
}
/**
 * 使用自旋机制,当执行完后,state会加回去,自动唤醒阻塞队列
 * @param releases 步长,正常情况均为1
 * @return
 */
@Override
protected boolean tryReleaseShared(int releases) {
    for (;;) {
        int current = getState();
        int next = current + releases;
        // 防止溢出
        if (next < current) {
            throw new Error("Maximum permit count exceeded");
        }
        if (compareAndSetState(current, next)) {
            return true;
        }
    }
}

相关文章链接:
<<<多线程基础
<<<线程安全与解决方案
<<<锁的深入化
<<<锁的优化
<<<Java内存模型(JMM)
<<<Volatile解决JMM的可见性问题
<<<Volatile的伪共享和重排序
<<<CAS无锁模式及ABA问题
<<<Synchronized锁
<<<Lock锁
<<<AQS同步器
<<<Condition
<<<CountDownLatch同步计数器
<<<CyclicBarrier屏障
<<<线程池
<<<并发队列
<<<Callable与Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何优化多线程总结

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

相关阅读更多精彩内容

友情链接更多精彩内容