Before obtaining an item each thread must acquire a permit from the semaphore, guaranteeing that an item is available for use.

When the thread has finished with the item it is returned back to the pool and a permit is returned to the semaphore, allowing

another thread to acquire that item. Note that no synchronization lock is held when acquire() is called as that would prevent an

item from being returned to the pool. The semaphore encapsulates the synchronization needed to restrict access to the pool,

separately from any synchronization needed to maintain the consistency of the pool itself.

A semaphore initialized to one, and which is used such that it only has at most one permit available, can serve as a mutual

exclusion lock. This is more commonly known as a binary semaphore, because it only has two states: one permit available,

or zero permits available. When used in this way, the binary semaphore has the property (unlike many Lock implementations),

that the "lock" can be released by a thread other than the owner (as semaphores have no notion of ownership). This can be

useful in some specialized contexts, such as deadlock recovery.

场景:20个人需要买票,但只有2个窗口

问题:如何控制同一时间并发数为2 ?

public class SemaphoreDemo {

    class SemaphoreRunnable implements Runnable{

        private Semaphore semaphore;
private int user; public SemaphoreRunnable(Semaphore semaphore, int user) {
this.semaphore = semaphore;
this.user = user;
} @Override
public void run() {
try {
semaphore.acquire();
//不能使用semaphore.tryAcquire();
System.out.printf("用户[%s]进入窗口\n", user );
Thread.sleep((long) (Math.random()*10000));
System.out.printf("用户[%s]离开窗口\n", user );
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} private void exec(){
Semaphore semaphore = new Semaphore(2);
ExecutorService executorService = Executors.newCachedThreadPool();
for(int i=0; i<20; i++){
executorService.execute(new SemaphoreRunnable(semaphore, i));
}
} public static void main(String[] args){
SemaphoreDemo demo = new SemaphoreDemo();
demo.exec();
}
}

java限流(一): Semaphore的更多相关文章

  1. Java限流策略

    概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃.此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待.排队. ...

  2. JUC 中提供的限流利器-Semaphore(信号量)

    在 JUC 包下,有一个 Semaphore 类,翻译成信号量,Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.Semaphore 跟锁 ...

  3. java限流工具类

    代码 import com.google.common.util.concurrent.RateLimiter; import java.util.concurrent.ConcurrentHashM ...

  4. java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能

    这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能 ...

  5. NET 5 原子操作、接口限流Semaphore以及性能测试JMeter

    一.Semaphore 限流也可使用令牌桶算法+redis 1.Semaphore定义 类似互斥锁,但它可以允许多个线程同时访问一个共享资源 通过使用一个计数器来控制对共享资源的访问,如果计数器大于0 ...

  6. 互联网进行限流策略的Semaphore信号量使用

    在Semaphore信号量非常适合高并发访问,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验.数据.历年的访问量,已经推广力度进行一个合理的评 ...

  7. java 服务接口API限流 Rate Limit

    一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...

  8. 使用AOP和Semaphore对项目中具体的某一个接口进行限流

    整体思路: 一 具体接口,可以自定义一个注解,配置限流量,然后对需要限流的方法加上注解即可! 二 容器初始化的时候扫描所有所有controller,并找出需要限流的接口方法,获取对应的限流量 三 使用 ...

  9. Java 对IP请求进行限流.

    高并发系统下, 有三把利器 缓存 降级 限流. 缓存: 将常用数据缓存起来, 减少数据库或者磁盘IO 降级: 保护核心系统, 降低非核心业务请求响应 限流: 在某一个时间窗口内对请求进行限速, 保护系 ...

随机推荐

  1. C# NPOI操作Excel(上)

    NPOI 官网下载DLL:http://npoi.codeplex.com/releases 1.读取Excel转为DataTable /// <summary> /// 读取excel转 ...

  2. JS倒计时效果

    [html] <div id="time"></div> <script> var pad = function(num){ return nu ...

  3. filebeat 选项

    Filebeat Options input_type: log|stdin 指定输入类型 paths 支持基本的正则,所有golang glob都支持,支持/var/log/*/*.log enco ...

  4. Audio简介

    本片只简单从硬件角度简介Audio AC97/HDA Audio总线分两种: (1)I2S (2)HDA HD Audio spec Audio verb table是用来初始化audio的,一个au ...

  5. Mysql 常用函数集

    1.分类导航 一共分为5类函数 . 字符型函数 . 数值型函数 . 日期型函数 . 统计型函数 . 其它型函数 2.字符型函数[约48个] ascii(str) bin(n) bit_length(s ...

  6. Atitit.虚拟机与指令系统的设计

    Atitit.虚拟机与指令系统的设计 1. 两种计算模型  ,堆栈机和状态机(基于寄存器的虚拟机1 1.1.1. 堆栈机1 1.1.2. 状态机2 2. 为什么状态机比堆栈机快呢?3 2.1. Sta ...

  7. cf #363 b

    B. One Bomb time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  8. poj 2942 Knights of the Round Table(无向图的双连通分量+二分图判定)

    #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #includ ...

  9. 创建oracle本地数据库步骤详解

    前提:安装好oracle数据库客户端: PL/SQL DEVELOPER 1.打开DatabaseConfiguration Assistant,如图: 选择创建数据库->next->选择 ...

  10. 分布式服务框架 Zookeeper(三)官方入门指南

    入门指南:使用ZooKeeper来协调分布式应用 这篇文档包含了让你快速上手ZooKeeper的信息.主要是针对那些想要试一把ZooKeeper的开发人员,包含了安装一个单一ZooKeeper服务器的 ...