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的值。

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

相关文章
|
6月前
|
安全
理解信号量
理解信号量
|
5月前
多线程并发之Semaphore(信号量)使用详解
多线程并发之Semaphore(信号量)使用详解
113 0
|
5月前
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
34 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
|
6月前
|
存储
信号量(下)
信号量(下)
22 0
|
6月前
|
算法
信号量(上)
信号量(上)
22 0
|
9月前
|
机器学习/深度学习 C语言
信号量
信号量
55 0
信号量(Semaphore)与线程计数器(CountDownLatch)
Semaphore属于共享锁,即多个线程可以同时获取,用来表示可用资源的个数,本质上是一个计数器。
信号量(Semaphore)与线程计数器(CountDownLatch)
|
Java 开发工具
信号量Semaphore及模型
信号量Semaphore
106 0
Semaphore 信号量源码分析
Semaphore 信号量源码分析
Semaphore 信号量源码分析
Semaphore信号量
Semaphore 可以用来限制或管理数量有限资源的使用情况 - 信号量的作用是用来维护一个“许可证”,的计数,线程可以获取 许可证,那信号量剩余许可证就减一,线程也可以是否一个许可证,那剩余的许可证就加一,当信号量拥有的许可证为0时,那么下一个线程想获得许可证,就要进行等待,直到另外线程释放许可证
255 0
Semaphore信号量