aqs同步组件

1.Semaphore?

 技术信号量用来控制能够同时访问某特定资源的活动的数量,或者同时执行某一给定操作的数据。计数信号量可以用来实现资源池或者给一个容器限定边界。

  信号量维护了一个许可集,许可的初始量通过构造函数传递给Semaphore。活动能够获取许可,并在使用之后释放许可,如果没有可用的许可,acquire方法会被阻塞,直到有可用的为止。每个release方法添加一个许可,从而可能释放一个正在阻塞的获取者

2.使用方法

  • Semaphore(int permits,boolean fair) 设置公平还是不公平的。
  • Semaphore(int permits):创建具有给定许可数和非公平设置的Semaphore
  • int availablePermits() :返回此信号量中当前可用的许可证数。
  • int getQueueLength():返回正在等待获取许可证的线程数。
  • boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
  • void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
  • Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。

3.SemaphoreDemo

  • SemaphoreDemo
    package com.mmall.concurrency.example.AQS.semaphore;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    
    public class SemaphoreDemo {
        public static void main(String[] args) {
            Semaphore semaphore=new Semaphore(3);
    
            Workers worker=new Workers("小黄",semaphore);
            Workers worker1=new Workers("小蓝",semaphore);
            Workers worker2=new Workers("小白",semaphore);
            Workers worker3=new Workers("小子",semaphore);
            Workers worker4=new Workers("小绿",semaphore);
            Workers worker5=new Workers("小黑",semaphore);
            Workers worker6=new Workers("小红",semaphore);
            ExecutorService executorService=Executors.newCachedThreadPool();
            executorService.execute(worker);
            executorService.execute(worker1);
            executorService.execute(worker2);
            executorService.execute(worker3);
            executorService.execute(worker4);
            executorService.execute(worker5);
            executorService.execute(worker6);
        }
    }
    
  • Workers
    package com.mmall.concurrency.example.AQS.semaphore;
    
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.concurrent.Semaphore;
    @Slf4j
    public class Workers implements Runnable {
        private String name;
        private Semaphore semaphore;
    
        public Workers(String name, Semaphore semaphore) {
            this.name = name;
            this.semaphore = semaphore;
        }
    
        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println(String.format("%s拿到了指令许可", name));
                Thread.sleep(3000);
                System.out.println(String.format("%s工作结束,还剩%s没有拿到指令许可", name, semaphore.getQueueLength()));
            }catch (Exception e){
                log.info("error{}",e);
            }
            semaphore.release();
        }
    }