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

    我们来看一下运行结果:

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

  • 相关阅读:
    django 1.9.7 css控制模板样式
    python -- 判断给定的参数是否是地理位置的经度和纬度
    有恃无恐
    不知不觉
    vscode 编写Python走过的坑
    Python的从头再来
    【初赛】数学题错题总结
    【初赛】选择题总结
    20175317 《Java程序设计》第四周学习总结
    20175317 《Java程序设计》第三周学习总结
  • 原文地址:https://www.cnblogs.com/ericz2j/p/10295514.html
Copyright © 2011-2022 走看看