zoukankan      html  css  js  c++  java
  • 并发编程-concurrent指南-信号量Semaphore

    Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

    acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。

    release()用来释放许可。注意,在释放许可之前,必须先获获得许可。

    下面通过一个例子来看一下Semaphore的具体使用:

    假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:

    import java.util.concurrent.Semaphore;
    
    public class Main {
        public static void main(String[] args) {
            Semaphore semaphore = new Semaphore(5);//5台机器
    
            //8个工人工作
            for(int i=0;i<8;i++){
                new Thread(new Worker(semaphore)).start();
            }
        }
    }
    import java.util.Random;
    import java.util.concurrent.Semaphore;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 工人
     */
    public class Worker implements Runnable{
        private Semaphore semaphore;
        public Worker(Semaphore semaphore){
            this.semaphore = semaphore;
        }
    
        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName()+"占用一个机器生产。。。");
                int random = new Random().nextInt(10);
                TimeUnit.SECONDS.sleep(random);
                System.out.println(Thread.currentThread().getName()+"释放出机器");
                semaphore.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    适用场景:

    Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。

    源码地址:https://github.com/qjm201000/concurrent_semaphore.git

  • 相关阅读:
    让开发效率“飞起”的VS Code 插件
    转-webpack学习笔记--整体配置结构
    十二、vue中watch原理
    十一、vue生命周期诠释--带图
    十、vue mixins 的用法
    八、Web移动端Fixed布局的解决方案
    七、vue中v-for有时候对页面不会重新渲染,数组变化后如何到渲染页面
    六、vue如何缓存页面
    五、vue常用UI组件
    vue组件递归
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10150270.html
Copyright © 2011-2022 走看看