Java并发包使用详解-Semaphore

简介: concurrent 包是java从1.5开始提供的一个针对多线程并发的包,里面包括我们熟悉的ConcurrentHashMap、CountDownLatch、cow等相关接口帮助我们去解决日常开发中复杂的多线程业务,这次介绍下Semaphore(信号量)

1、Semaphore是什么

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。

2使用场景

用于有明确限制访问数量的场景,通常是多线程的限流

(1) 数据库连接池,在数据库连接池面对高于自身连接资源时,限制连接数量,保证连接数过多的情况下项目不会崩溃或者变慢

(2)项目内多个节点间的访问,网络io发生峰值并发时,保证节点的并发数安全不至于崩溃

提示:不适合秒杀等场景

3、常用方法说明

1acquire();

作用:获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直处于阻塞状态。

1.png

2acquire(int permits);

                作用:获取一个令牌,在获取到令牌、或者被其他线程调用中断、或超时之前线程一直处于阻塞状态。

2.jpg

3acquireUninterruptibly()

作用:获取一个令牌,在获取到令牌之前线程一直处于阻塞状态(忽略中断)。

3.jpg

4tryAcquire()

作用:尝试获得令牌,返回获取令牌成功或失败,不阻塞线程。

4.png

5tryAcquire(long timeout, TimeUnit unit)

作用:尝试获得令牌,在超时时间内循环尝试获取,直到尝试获取成功或超时返回,不阻塞线程。

5.png

6release()

作用:释放一个令牌,唤醒一个获取令牌不成功的阻塞线程。

6.png

7hasQueuedThreads()

作用:等待队列里是否还存在等待线程。

7.png

8getQueueLength()

作用:获取等待队列里阻塞的线程数。

8.png

9drainPermits()

作用:清空令牌把可用令牌数置为0,返回清空令牌的数量。

9.png

4、 基本使用

多个线程同时执行,但是限制同时执行的线程数量为 2

10.png

结果:

11.png

从打印结果可以看出,一次只有两个线程执行 acquire(),只有线程进行 release() 方法后才会有别的线程执行 acquire()

 

需要注意的是 Semaphore 只是对资源并发访问的线程数进行监控,并不会保证线程安全。

相关文章
|
2月前
|
Java 调度
JAVA同步锁Semaphore
JAVA同步锁Semaphore
|
10月前
|
Java 程序员
Java中的Semaphore和CountDownLatch这两个工具类的使用方法和实际应用场景
Java中的Semaphore和CountDownLatch这两个工具类的使用方法和实际应用场景
169 0
|
11月前
|
Java
Java Review - 并发编程_ 信号量Semaphore原理&源码剖析
Java Review - 并发编程_ 信号量Semaphore原理&源码剖析
73 0
|
11月前
|
Java
Java多线程:Semaphore
Java多线程:Semaphore
82 0
|
Java
【Java技术指南】「原理剖析」Semaphore工作原理分析
【Java技术指南】「原理剖析」Semaphore工作原理分析
73 0
|
Java Windows
Java 并发编程之Semaphore详解
Java 并发编程之Semaphore详解
Java——多线程高并发系列之JUC三大辅助类(CountDownLatch、CyclicBarrier、Semaphore)
Java——多线程高并发系列之JUC三大辅助类(CountDownLatch、CyclicBarrier、Semaphore)
Java——多线程高并发系列之JUC三大辅助类(CountDownLatch、CyclicBarrier、Semaphore)
|
Java
详解java中的同步工具类Semaphore
Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了。这篇文章将对Semaphore的概念和使用进行一个详解。
141 0
详解java中的同步工具类Semaphore
|
Java Maven
Java Semaphore实现高并发场景下的流量控制(附源码) | 实用代码架构
Java Semaphore实现高并发场景下的流量控制(附源码) | 实用代码架构
|
缓存 监控 安全
JAVA并发包与线程池
JAVA并发包与线程池