高级java每日一道面试题-2024年12月28日-并发篇-了解Semaphore吗?

embedded/2024/12/31 9:30:36/

如果有遗漏,评论区告诉我进行补充

面试官: 了解Semaphore吗?

我回答:

在Java高级面试中,Semaphore(信号量)是一个重要的并发控制工具,它用于控制同时访问特定资源的线程数量,以确保资源的合理使用。以下是对Semaphore的详细解析:

一、Semaphore的基本概念

Semaphore(信号量)是一种基于计数的同步机制,它允许多个线程同时访问某个资源池,但会限制可以同时访问该资源的线程数量。Semaphore通过维护一个内部计数器来跟踪当前可用的许可数量,当线程需要访问资源时,它会尝试从Semaphore获取一个许可,如果许可可用,则线程可以继续执行;如果许可不可用,则线程将被阻塞,直到有许可被释放为止。

二、Semaphore的使用场景

Semaphore通常用于那些资源有明确访问数量限制的场景,例如:

  1. 数据库连接池:同时连接数据库的线程数量有限,当连接数达到限制时,后续的线程需要等待前面的线程释放数据库连接。
  2. 停车场管理:停车场的车位数量有限,当车位满时,新的车辆需要等待有空位才能进入。
  3. 文件读写:同时允许并发访问某个文件的线程数量有限,以避免文件损坏或数据不一致。
  4. 线程池:限制同时运行的任务数量。
  5. 资源访问控制:如上面的例子所示,限制对特定资源的并发访问。
  6. 流量控制:在网络编程中,可以用来限制同一时间处理的数据包数量。

三、Semaphore的主要方法

Semaphore提供了几个关键的方法来管理许可:

  1. acquire():获取一个许可,如果没有可用的许可,则当前线程将被阻塞,直到有许可被释放。
  2. tryAcquire():尝试获取一个许可,如果没有可用的许可,则立即返回false,而不会阻塞当前线程。
  3. release():释放一个许可,增加可用许可的数量,并可能唤醒一个正在等待许可的线程。
  4. availablePermits():返回当前可用的许可数量。
  5. drainPermits():清空所有可用的许可,返回清空前可用的许可数量。
  6. reducePermits(int reduction):减少可用许可的数量。
  7. increasePermits(int increase):增加可用许可的数量。

四、Semaphore的实现原理

Semaphore基于AbstractQueuedSynchronizer(AQS)的共享模式实现。在Semaphore初始化时,会创建一个同步阻塞队列,并将初始的许可数量赋值给队列的state状态。当线程调用acquire方法时,它会尝试从队列中获取一个许可:

  • 如果state的值大于0,表示有可用的许可,线程将获取一个许可,并将state的值减1。
  • 如果state的值为0,表示没有可用的许可,线程将被阻塞,并加入到一个等待队列中。当有其他线程释放许可时,等待队列中的线程将被唤醒,并尝试重新获取许可。

五、Semaphore的示例代码

以下是一个使用Semaphore的示例代码,用于模拟一个停车场的管理系统:

java">import java.util.concurrent.Semaphore;
import java.util.Random;public class TestCar {// 停车场同时容纳的车辆数量private static Semaphore semaphore = new Semaphore(10);public static void main(String[] args) {// 模拟100辆车进入停车场for (int i = 0; i < 100; i++) {Thread thread = new Thread(new Runnable() {public void run() {try {System.out.println("====" + Thread.currentThread().getName() + "来到停车场");if (semaphore.availablePermits() == 0) {System.out.println("车位不足,请耐心等待");}semaphore.acquire(); // 获取令牌尝试进入停车场System.out.println(Thread.currentThread().getName() + "成功进入停车场");Thread.sleep(new Random().nextInt(10000)); // 模拟车辆在停车场停留的时间System.out.println(Thread.currentThread().getName() + "驶出停车场");semaphore.release(); // 释放令牌,腾出停车场车位} catch (InterruptedException e) {e.printStackTrace();}}}, i + "号车");thread.start();}}
}

在这个示例中,我们创建了一个初始可用资源为10的Semaphore对象,然后模拟了100辆车进入停车场的过程。每辆车都会尝试获取一个许可(即一个车位),如果车位不足,则车辆会被阻塞在停车场入口。当有车辆离开停车场时,会释放一个许可,从而允许新的车辆进入。

六、Semaphore的公平与非公平模式

Semaphore有两种模式:公平模式和非公平模式。

  • 公平模式:按照线程调用acquire方法的顺序来获取许可,即先来的线程先获得许可。
  • 非公平模式:允许抢占式的获取许可,即后来的线程也有可能先获得许可。

在默认情况下,Semaphore使用的是非公平模式。如果需要公平模式,可以在创建Semaphore对象时传入一个true参数。

总结

Semaphore 是一种强大的同步工具,适用于需要限制并发访问数量的场景。通过合理配置其参数和使用方法,可以有效地管理和优化系统的并发性能。


http://www.ppmy.cn/embedded/149761.html

相关文章

Springboot项目下面使用Vue3 + ElementPlus搭建侧边栏首页

Springboot项目下面、在html 页面 Vue3 ElementPlus 搭建侧边栏首页 1、效果图 2、static 文件下面的项目结构 3、代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><…

【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训

升级版1-清空全部的再次确认 实现功能: 历史搜索记录展示-历史搜索记录展示10条点击跳转-点击历史搜索记录可同步到搜索框并自动搜索全部删除-可一次性全部删除历史搜索记录全部删除-有再次确认操作展示 进行搜索后留下搜索记录 点击垃圾桶图标,显示【清空全部】 点击【清…

K8s 不同层次的进程间通信实现

在 Kubernetes (K8s) 中&#xff0c;不同层次的进程间通信实现方式如下&#xff1a; 1. Pod 内进程间通信 Pod 是 Kubernetes 中的最小部署单元&#xff0c;通常包含一个或多个共享相同网络命名空间的容器。 方式&#xff1a; 使用 localhost 和容器暴露的端口进行通信。共享文…

【Redis】Redis 典型应用 - 缓存 (cache)

目录 1. 什么是缓存 2. 使用 Redis 作为缓存 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 4. 缓存的淘汰策略 5. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 关于缓存预热 (Cache preheating) 关于缓存穿透 (Cache penetration) 关于缓存雪崩 (Cache avalanche) 关…

C++的23种设计模式

设计模式是软件设计中的最佳实践&#xff0c;提供了解决常见问题的标准方法。以下是 C 中的 23 种经典设计模式&#xff0c;分为三类&#xff1a;创建型、结构型和行为型。 1. 创建型模式 1.1 单例模式&#xff08;Singleton&#xff09; 确保一个类只有一个实例&#xff0c…

微服务——部署与运维

1、你是否有将 Java 微服务部署到容器&#xff08;如 Docker&#xff09;中的经验&#xff1f;请描述一下部署过程和相关注意事项。 部署过程&#xff1a; 编写 Dockerfile&#xff0c;定义基础镜像&#xff08;如 openjdk&#xff09;、应用 JAR 包路径和启动命令。构建镜像…

基于Django+python的Python在线自主评测系统设计与实现

项目运行 需要先安装Python的相关依赖&#xff1a;pymysql&#xff0c;Django3.2.8&#xff0c;pillow 使用pip install 安装 第一步&#xff1a;创建数据库 第二步&#xff1a;执行SQL语句&#xff0c;.sql文件&#xff0c;运行该文件中的SQL语句 第三步&#xff1a;修改源…

惯性动捕套装与虚拟人应用 | 激活3D虚拟人互动性与表现力

3D虚拟数字人以前所未有的频率穿梭于我们的视野之中&#xff0c;无论是娱乐直播、商业营销&#xff0c;还是文旅、科教领域的创新实践&#xff0c;虚拟数字人都以高度逼真的外形与交互能力&#xff0c;引领着一场跨越现实与虚拟边界的变革。 而这场变革的背后&#xff0c;动作捕…