Java并发编程信号量Semapher

Java并发编程信号量Semapher攻略

在Java并发编程中,信号量(Semaphore)是一种用于控制并发线程数量的工具,大多用于控制对共享资源的访问,通过信号量的控制,可以实现线程之间的协作与资源控制。

信号量(Semaphore)的概念及使用方法

信号量(Semaphore)是一个经典的多线程同步控制工具,它用于控制同时访问某个资源的线程数量,通过指定信号量的许可数量,我们可以控制同时访问共享资源的线程数量。

具体来说,Semaphore可以分为两种类型:

  • 二元信号量(Binary Semaphore):只具有两种状态,1表示可用,0表示不可用,通常将其用于控制对临界区的访问;
  • 计数信号量(Counting Semaphore):具有一定数量的状态,我们可以通过调用release()方法增加信号量,调用acquire()方法减少信号量。

Semaphore的使用方法如下:

Semaphore sem = new Semaphore(permits); // 构造Semaphore对象,permits表示初始信号量的数量
sem.acquire(); // 获取信号量,如果信号量不够的话就一直等待
...
sem.release(); // 释放信号量

示例一:Semaphore控制线程并发访问

下面的示例用两个线程并发访问同一个共享资源,通过Semaphore控制线程的并发访问数量:

public class SemaphoreDemo {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(2); // 构造Semaphore对象,permit数量为2
        ExecutorService executorService = Executors.newCachedThreadPool(); // 构造线程池

        for (int i = 1; i <= 10; i++) { // 启动10个线程
            executorService.execute(() -> {
                try {
                    semaphore.acquire(); // 获取Semaphore许可
                    System.out.println(Thread.currentThread().getName()+" got the permit.");
                    Thread.sleep(2000); // 等待2s
                    semaphore.release(); // 释放Semaphore许可
                    System.out.println(Thread.currentThread().getName()+" released the permit.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        executorService.shutdown(); // 关闭线程池
    }
}

运行结果如下:

pool-1-thread-1 got the permit.
pool-1-thread-2 got the permit.
pool-1-thread-1 released the permit.
pool-1-thread-3 got the permit.
pool-1-thread-2 released the permit.
pool-1-thread-4 got the permit.
pool-1-thread-3 released the permit.
pool-1-thread-5 got the permit.
pool-1-thread-4 released the permit.
pool-1-thread-6 got the permit.
pool-1-thread-5 released the permit.
pool-1-thread-7 got the permit.
pool-1-thread-6 released the permit.
pool-1-thread-8 got the permit.
pool-1-thread-7 released the permit.
pool-1-thread-10 got the permit.
pool-1-thread-9 got the permit.
pool-1-thread-10 released the permit.
pool-1-thread-9 released the permit.

可以看到,在Semaphore的控制下,每次只有两个线程能够同时访问共享资源,其他线程需要等待已经获取许可的线程释放许可后才能继续执行。

示例二:Semaphore模拟停车场

下面的示例用Semaphore模拟停车场系统,停车场只允许有限数量的车辆进入,超过限制的车辆需要等待其他车辆驶离后才能进入:

public class SemaphoreParkingDemo {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(2); // 停车场只能同时容纳2辆汽车
        ExecutorService executorService = Executors.newCachedThreadPool(); // 构造线程池

        for (int i = 1; i <= 5; i++) { // 启动5辆汽车
            executorService.execute(() -> {
                try {
                    semaphore.acquire(); // 获取Semaphore许可
                    System.out.println(Thread.currentThread().getName() + " 进入了停车场。");
                    Thread.sleep(new Random().nextInt(1000)); // 随机停留1s以内的时间
                    semaphore.release(); // 释放Semaphore许可
                    System.out.println(Thread.currentThread().getName() + " 离开了停车场。");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        executorService.shutdown(); // 关闭线程池
    }
}

运行结果如下:

pool-1-thread-1 进入了停车场。
pool-1-thread-2 进入了停车场。
pool-1-thread-2 离开了停车场。
pool-1-thread-3 进入了停车场。
pool-1-thread-4 进入了停车场。
pool-1-thread-1 离开了停车场。
pool-1-thread-3 离开了停车场。
pool-1-thread-5 进入了停车场。
pool-1-thread-4 离开了停车场。
pool-1-thread-5 离开了停车场。

可以看到,Semaphore实现了停车场的限流,只有2辆汽车能够同时进入停车场,其他的汽车需要等待前面的汽车离开才能进入。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java并发编程信号量Semapher - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Java并发程序入门介绍

    Java并发程序入门介绍攻略 简介 Java并发编程是指在多线程环境下,多个线程之间相互合作、协同工作的编程模型。Java并发编程常常被采用于提高程序运行效率、提升程序响应速度以及提高程序质量等方面。本篇文章将简单介绍Java并发编程的基本知识,包括Java并发编程的常见术语、Java并发编程的核心知识点以及Java并发编程的示例等。 Java并发编程常见术…

    多线程 2023年5月16日
    00
  • Java 多线程的同步代码块详解

    Java 多线程的同步代码块详解 在Java中,多线程操作的时候,经常会出现多个线程共享同一个资源的情况。当多个线程同时访问共享资源时,会导致数据不一致的问题,这就需要用到同步代码块来解决。 什么是同步代码块? 同步代码块是Java中实现线程安全的一种机制,用来解决多个线程同时访问共享资源的并发问题。同步代码块是指用 synchronized 关键字修饰的一…

    多线程 2023年5月16日
    00
  • Java线程同步的四种方式详解

    Java线程同步的四种方式详解 在 Java 并发编程中,线程同步是非常重要的一个话题。线程同步是解决多个线程访问共享资源时所导致的数据不一致或者死锁问题的一种机制。本篇攻略将详细讲解 Java 线程同步的四种方式。 1. synchronized 关键字 synchronized 是 Java 官方提供的最基本的一种同步方式。它可以保证同一个时刻只有一个线…

    多线程 2023年5月16日
    00
  • 详解Java多线程和IO流的应用

    详解Java多线程和IO流的应用 简介 Java多线程和IO流是Java编程中非常重要的两个主题。多线程可以帮助我们充分利用计算机多核处理器的性能,从而提高程序运行效率。而IO流则可以帮助我们进行文件读写、网络通信等操作。本文将从基础概念讲解和实际例子两个方面介绍Java多线程和IO流的应用。 基础概念讲解 多线程 Java多线程是指在同一时刻,多条线程同时…

    多线程 2023年5月17日
    00
  • 微信小程序解除10个请求并发限制

    微信小程序解除10个请求并发限制攻略 在微信小程序的开发中,我们发现在一个页面同时发出多个请求时,最多只能同时发出10个请求,这个限制影响了小程序的并发能力。本文将介绍如何解除这个限制。 1. 原因 微信小程序同时请求的数量是有限制的,默认情况下是10个。这是为了避免小程序发送过多的请求导致服务器超载。另外,微信小程序还有IP访问频率的限制。超过一定频率会被…

    多线程 2023年5月16日
    00
  • Java并发编程之死锁相关知识整理

    Java并发编程之死锁相关知识整理 什么是死锁? 死锁是指两个或多个线程在执行过程中,因互相竞争资源而造成的一种互相等待的现象,若无外力干涉势将无法推进下去。 什么情况下会发生死锁? 当系统资源不足时,进程会因争夺资源而陷入僵局。若此时系统能够协调资源分配,以便令进程有序地进行,便可避免进程间死锁的发生。 在Java并发编程中,一般出现死锁的情况是因为线程之…

    多线程 2023年5月16日
    00
  • java 多线程的三种构建方法

    Java 多线程的三种构建方法 在 Java 中,有三种常用的多线程构建方法:继承 Thread 类、实现 Runnable 接口和实现 Callable 接口。个人建议在实际开发中尽量使用实现 Runnable 接口的方法。 继承 Thread 类 继承 Thread 类是 Java 最原始的多线程实现方法。具体实现过程是创建一个类继承 Thread 类,…

    多线程 2023年5月17日
    00
  • Mysql事务并发问题解决方案

    那我来详细讲解一下 MySQL 事务并发问题的解决方案。 什么是 MySQL 事务并发问题 并发问题指多个用户同时访问同一份数据时,由于读写操作的顺序不同,产生了冲突,导致数据出现异常。MySQL 数据库在支持事务的同时,也存在并发问题。 比如,用户 A 和用户 B 同时对一个数据进行操作,A 想要写入数据,B 想要读取数据。若此时 B 先读取了数据,但 A…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部