zoukankan      html  css  js  c++  java
  • java并发中的Semaphore

    • 什么是Semaphore 
      Semaphore可以控制某个资源可被同时访问的个数(locks和synchronized锁,在任何时刻只允许一个任务访问一个资源),通过acquire()获取一个许可,如果没有则等待,release()释放一个许可。可以将Semaphore看成分发许可证,只有分到许可的线程才能访问线程,访问资源完毕后需要返还许可,以便让等待的线程获取许可访问资源。 
      Semaphore有两个构造函数,Semaphore(int)和Semaphore(int,boolean)。参数中的int表示该信号量拥有的许可数量,boolean表示获取许可的时候是否是公平的,如果是公平的那么,当有多个线程要获取许可时,会按照线程来的先后顺序分配许可,否则,线程获得许可的顺序是不定的。

    • 一个实例

      public class TestSemaphore {
          public static void main(String[] args) {
              // 线程池
              ExecutorService exec = Executors.newCachedThreadPool();
              //一次只能5个线程同时访问
              final Semaphore semp = new Semaphore(5);
              // 模拟20个客户端访问
              for (int index = 0; index < 20; index++) {
                  final int NO = index;
                  Runnable run = new Runnable() {
                      public void run() {
                          try {
                              // 获取许可
                              semp.acquire();
                              System.out.println("Accessing: " + NO);
                              Thread.sleep((long) (Math.random() * 10000));
                              // 访问完后,释放
                              semp.release();
                              System.out.println("-----------------"+semp.availablePermits());
                          } catch (InterruptedException e) {
                              e.printStackTrace();
                          }
      
                      }
      
                  };
                  exec.execute(run);
              }
      
              // 退出线程池
              exec.shutdown();
      
          }
      }
    • 执行结果

      Accessing: 0
      Accessing: 1
      Accessing: 2
      Accessing: 3
      Accessing: 4
      -----------------0
      Accessing: 5
      -----------------1
      Accessing: 6
      -----------------1
      Accessing: 7
      -----------------1
      Accessing: 8
      -----------------1
      Accessing: 9
      -----------------1
      Accessing: 10
      -----------------1
      Accessing: 11
      -----------------1
      Accessing: 12
      -----------------1
      Accessing: 13
      -----------------1
      Accessing: 14
      -----------------1
      Accessing: 15
      -----------------1
      Accessing: 16
      -----------------1
      Accessing: 17
      -----------------1
      Accessing: 18
      -----------------1
      Accessing: 19
      -----------------1
      -----------------2
      -----------------3
      -----------------4
      -----------------5
      

        

      同时有五个线程可以执行,获取资源后打印语句后随机睡眠,最后释放资源,semp.availablePermits(),可以获得的许可数量,是放一个后将有一个没有被分发的许可证,当有多的许可证时,会采取先到先得的方式分配许可。Semaphore实际上没有使用任何许可证对象,只是以打比方的方式来说明是如何执行的。

  • 相关阅读:
    N95当手柄玩游戏,甩起来还可以用手势控制电脑,分享一下我们的设计经验
    这个回答真逗
    基于事件通信的轻量级MVP框架实现,附源码
    敏捷开发读书笔记
    开发Access数据库提示的"标准表达式中数据类型不匹配",DateTime类型解决办法
    解决mysql表已满的错误
    我的OO实践由GPS消息处理抽象出一通用命令处理类
    收到开Windows 7 party的资源了【无图无真相】
    一)我要做什么,Petshop 源码分析
    天津大学免费上网,IPV4及IPV6同时共享的解决方案
  • 原文地址:https://www.cnblogs.com/Hdaydayup/p/7610056.html
Copyright © 2011-2022 走看看