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并发编程系列(7)Semaphore信号量剖析
腾讯T2面试,要求在3分钟内用不超过20行代码模拟地铁安检进站过程。题目设定10个安检口,100人排队,每人安检需5秒。实际中,这种题目主要考察并发编程能力,特别是多个线程如何共享有限资源。今天我们使用信号量(Semaphore)实现,限制同时进站的人数,并通过信号量控制排队和进站流程。并详细剖析信号量核心原理和源码。
|
4月前
|
Java 测试技术 开发者
Java面试题:解释CountDownLatch, CyclicBarrier和Semaphore在并发编程中的使用
Java面试题:解释CountDownLatch, CyclicBarrier和Semaphore在并发编程中的使用
72 11
|
5月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
34 1
|
5月前
|
存储 并行计算 Java
Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
52 2
|
5月前
|
Java 数据库
深入解析Java并发包(JUC)中的Semaphore
深入解析Java并发包(JUC)中的Semaphore
|
6月前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
64 2
|
6月前
|
Java
Java Semaphore 信号量详解
Java Semaphore 信号量详解
44 3
|
6月前
|
安全 Java 测试技术
今天我们来聊一聊Java中的Semaphore
【5月更文挑战第3天】今天我们来聊一聊Java中的Semaphore
57 3
|
6月前
|
Java 调度
JAVA同步锁Semaphore
JAVA同步锁Semaphore
|
Java 程序员
Java中的Semaphore和CountDownLatch这两个工具类的使用方法和实际应用场景
Java中的Semaphore和CountDownLatch这两个工具类的使用方法和实际应用场景
201 0
下一篇
无影云桌面