zoukankan      html  css  js  c++  java
  • Java多线程_Semaphore信号量

    概念:

    Semaphore是信号量,又称为信号灯,它可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制。
    当Semaphore的个数变成1时,即代表只允许一个线程访问,这是Semaphore的功能就变成了Lock的功能。

    它有两个核心方法:

    • acquire() 获取一个许可,得到许可才能执行后面的代码,如果没有就等待。
    • release() 释放一个许可。

    实例:
    给出这样一个实例:现有3个信号量,有6个线程去获取信号量,获取到就执行,没获取到就等待,直到有信号量被释放。

    import java.util.Random;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    
    public class SemaphoreDemo implements Runnable {
        Semaphore semaphore = new Semaphore(3);   //创建三个信号量
    
        @Override
        public void run() {
            try {
                semaphore.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "得到一个信号量");
            try {
                Thread.sleep(new Random().nextInt(2000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            semaphore.release();
            System.out.println(Thread.currentThread().getName() + "释放一个信号量");
        }
    
        public static void main(String[] args) {
            SemaphoreDemo sd = new SemaphoreDemo();
            ExecutorService service = Executors.newFixedThreadPool(6);
            while (true) {
                service.execute(sd);
            }
        }
    }

    我们来看一下运行结果:

    另外需要注意的一点:
    信号灯可以由一个线程使用,然后由另一个线程来进行释放,而锁只能由同一个线程启动和释放,不然就好发生死锁。

  • 相关阅读:
    C++ primer 简读
    C++函数及类方法(待补充)
    C++参数传递-复制和引用
    c++动态分配内存
    C++内存与指针
    c++循环
    C++容器vector及迭代器对象iterator
    c++字符类型一些知识点
    CNN中卷积运算转化成矩阵乘法的实现——img2col+GEMM大矩阵乘法
    046 LeetCode go
  • 原文地址:https://www.cnblogs.com/ericz2j/p/10295514.html
Copyright © 2011-2022 走看看