无法理解或实现信号量

Not able to understand or implement Semaphore

下面写了class来了解SemaPhore。然而结果却出乎意料。我无法理解 SemaPhore 的实际工作。它如何用作锁、信号和计数?

public class TrySemaPhore 
    {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newFixedThreadPool(10);
            Semaphore semaphore = new Semaphore(2);
            Runnable newTask= () -> {
                boolean permit = false;
                try {
                    permit = semaphore.tryAcquire();
                   if(permit)
                   System.out.println("doing work");
                } finally {
                    if(permit){
                        semaphore.release();
                        System.out.println("Work done!!");
                    }
                }
            };
            for(int i=0; i<=4; i++){
                executor.submit(newTask);
                }
            stop(executor);
        }

        private static void stop(ExecutorService executor) {
            /*code to stop executor*/
        }
    }

结果

doing work
Work done!!
doing work
Work done!!
doing work
Work done!!
doing work
Work done!!
doing work
Work done!!

我有 10 个固定数量的线程。我有 5 个不同的任务(for 循环)需要完成。我有带有 2 个许可证的信号量。我想了解信号量及其以一种非常简单的方式带来的好处(不像通过谷歌搜索获得的理论)。

计数信号量。从概念上讲,信号量维护一组 许可证。如果有必要,每个获取块,直到获得许可 可用,然后拿走它。每个版本增加一个许可证, 可能释放阻止收购方。

在获取项目之前,每个线程必须获得来自 信号量,保证一个项目可以使用。什么时候 线程已完成返回到的项目 池和许可证返回到信号量,允许另一个 线程来获取该项目。注意没有同步锁 在调用 acquire 时举行,因为这会阻止项目 从返回到池中。信号量封装了 同步需要单独限制对池的访问 从保持一致性所需的任何同步 池本身。

用例: 1.An 无界队列需要一个信号量(用于计算队列条目)和一个受互斥锁保护的线程安全队列(或等效的无锁线程安全队列)。信号量被初始化为零。生产者锁定互斥量,将对象推入队列,解锁互斥量并向信号量发出信号。消费者等待信号量,锁定互斥量,弹出对象并解锁互斥量。

2.Object 池,您可以在其中使用信号量限制资源的数量。多个线程尝试获取池中的对象并且您的对象数量有限,然后一些线程将等待直到一些线程释放。

class Pool {
  private static final int MAX_AVAILABLE = 100;
  private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

  public Object getItem() throws InterruptedException {
   available.acquire();
   return getNextAvailableItem();
  }

  public void putItem(Object x) {
   if (markAsUnused(x))
    available.release();
  }