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);
            }
        }
    }

    我们来看一下运行结果:

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

  • 相关阅读:
    面向对象SOLID原则-设计模式-第2篇
    python 设计模式 开篇 第1篇
    区块链 第1篇 什么是区块链 区块链与比特币的关系 区块链的发展历史 应用领域
    HTTP协议六种请求:GET,HEAD,PUT,DELETE,POST
    python垃圾回收机制
    类的MRO属性 C3算法
    Vue第六篇 element-ui 项目管理工具npm webpack 启Vue项目vue-cli
    《EffctiveJava》泛型
    Kafka总结
    Windows 关闭端口号
  • 原文地址:https://www.cnblogs.com/ericz2j/p/10295514.html
Copyright © 2011-2022 走看看