Semaphore(信号量)介绍以及实例

简介: Semaphore(信号量)介绍以及实例

一、介绍


Semaphore是 java.util.Concurrent下的一个类

image.png

Semaphore翻译过来是信号量的意思,它的作用是控制多个线程对同一个资源的访问线程数量。比如在停车场停车,里面有10个车位,当这10个车位被停满的时候其他的车只能等待(堵塞)里面有车驶出(release)然后再进入。

Semaphore可以用做流量控制,主要是共用资源的应用场景。

二、常用方法


void acquire()从该信号量获取许可证,阻止直到可用,或线程为 interrupted
void acquire(int permits)从该信号量获取给定数量的许可证,阻止直到所有可用,否则线程为 interrupted
void acquireUninterruptibly()从这个信号灯获取许可证,阻止一个可用的。
void acquireUninterruptibly(int permits)从该信号量获取给定数量的许可证,阻止直到所有可用。
int availablePermits()返回此信号量中当前可用的许可数。
void release()释放许可证,将其返回到信号量。
void release(int permits)释放给定数量的许可证,将其返回到信号量。
boolean tryAcquire()从这个信号量获得许可证,只有在调用时可以使用该许可证。
boolean tryAcquire(int permits)从这个信号量获取给定数量的许可证,只有在调用时全部可用。
  • acquire():获取一个访问令牌,获取令牌就可以对资源进行访问,如果没有获取成功就阻塞等待。
  • release():在获取玩资源时归还令牌,给其他的线程使用。
  • tryacquire():获取一个访问令牌,获取令牌就可以对资源进行访问,如果没有获取成功不阻塞等待而是返回一个false。
  • availablePermits():获取许可证的总数

三、Semaphore的构造


image.png

传入一个permits来表示当前信号量允许拥有的最大许可数量。

四、实例


public class SemaphoreDemo {
    public static int num = 0;
    public static void main(String[] args) throws InterruptedException {
        Semaphore semaphore = new Semaphore(1);
        for (int i = 0; i < 2; i++) {
            new Thread(() -> {
                try {
                    semaphore.acquire();
                    for (int j = 0; j < 5000; j++) {
                        num++;
                    }
                    semaphore.release();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }).start();
        }
        Thread.sleep(3000);
        System.out.println(num);
    }
}

image.png

这里我创建了两个匿名线程分别去执行5000次对num的++操作,这里的运行结果时10000而没有出现线程竞争出现的加数原子性问题,是因为这里我限制了许可证只有一个当一个线程拿到并且在执行完后才能归还许可让下一个阻塞等待的线程拿到去执行。

最后的Thread.sleep(300)是让主线程等待一下我们创建的两个线程执行完再输出num的值。

如果有多线程的问题可以访问我的博客主页欢迎讨论!

相关文章
|
安全
理解信号量
理解信号量
|
3月前
|
Java
JAVA并发编程系列(7)Semaphore信号量剖析
腾讯T2面试,要求在3分钟内用不超过20行代码模拟地铁安检进站过程。题目设定10个安检口,100人排队,每人安检需5秒。实际中,这种题目主要考察并发编程能力,特别是多个线程如何共享有限资源。今天我们使用信号量(Semaphore)实现,限制同时进站的人数,并通过信号量控制排队和进站流程。并详细剖析信号量核心原理和源码。
|
7月前
多线程并发之Semaphore(信号量)使用详解
多线程并发之Semaphore(信号量)使用详解
2536 0
|
算法
信号量(上)
信号量(上)
39 0
|
存储
信号量(下)
信号量(下)
44 0
|
机器学习/深度学习 C语言
信号量
信号量
92 0
|
Java 数据库连接 API
【JUC】信号量Semaphore详解
【JUC】信号量Semaphore详解
185 0
【JUC】信号量Semaphore详解
信号量(Semaphore)与线程计数器(CountDownLatch)
Semaphore属于共享锁,即多个线程可以同时获取,用来表示可用资源的个数,本质上是一个计数器。
信号量(Semaphore)与线程计数器(CountDownLatch)
信号量的使用
信号量的使用
203 0
|
Java
Java并发编程之Semaphore信号量
Java并发编程之Semaphore信号量
156 0
Java并发编程之Semaphore信号量