并发控制(7)信号量

雨点打透心脏的1/2处 2022-07-16 23:15 246阅读 0赞

并发控制(7)信号量

  • Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。
  • 典型的应用场景,可以是限制JAVA程序的访问数量,比如我相对制定的程序做个压力测试,我想限制线访问的流量啥的,可以用这个.

有如下代码,最多只能有5个线程同时访问

  1. import java.util.concurrent.ExecutorService;
  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.Semaphore;
  4. public class UseSemaphore {
  5. public static void main(String[] args) {
  6. // 线程池
  7. ExecutorService exec = Executors.newCachedThreadPool();
  8. // 只能5个线程同时访问
  9. final Semaphore semp = new Semaphore(5);
  10. // 模拟20个客户端访问
  11. for (int index = 0; index < 20; index++) {
  12. final int NO = index;
  13. Runnable run = new Runnable() {
  14. public void run() {
  15. try {
  16. // 获取许可
  17. semp.acquire();
  18. System.out.println("Accessing: " + NO);
  19. //模拟实际业务逻辑
  20. Thread.sleep((long) (Math.random() * 10000));
  21. // 访问完后,释放
  22. semp.release();
  23. } catch (InterruptedException e) {
  24. }
  25. }
  26. };
  27. exec.execute(run);
  28. }
  29. try {
  30. Thread.sleep(10);
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. //System.out.println(semp.getQueueLength());
  35. // 退出线程池
  36. exec.shutdown();
  37. }
  38. }

发表评论

表情:
评论列表 (有 0 条评论,246人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java并发 - Semaphore(信号

    应用场景:多个共享资源互斥、并发限流(如Hystrix)。 信号量是操作系统中,实现进程间资源的互斥与同步。信号量维护了一组许可证,以约束访问被限制资源的线程数。 Java

    相关 Linux信号线程控制

    线程中互斥锁的使用,达到对共享资源互斥使用。除了使用互斥锁,信号量,也就是操作系统中所提到的PV原语,能达到互斥和同步的效果,这就是今天我们所要讲述的信号量线程控制。 PV