Semaphore(应对并发问题的工具类)

Semaphore

Semaphore字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目。

举例:现在有一个十字路口,有多辆汽车需要进经过这个十字路口,但是我们规定同时只能有两辆汽车经过。其他汽车处于等待状态,只要某一个汽车经过了这个十字路口,其他的汽车才可以经

过,但是同时只能有两个汽车经过。如何限定经过这个十字路口车辆数目呢? 我们就可以使用Semaphore。

Semaphore的常用方法

public Semaphore(int permits)						permits 表示许可线程的数量
public void acquire() throws InterruptedException	表示获取许可
public void release()								表示释放许可

案例演示:模拟汽车通过十字路口

实现步骤:

  1. 创建一个汽车的线程任务类(CarThreadRunnable),在该类中定义一个Semaphore类型的成员变量
  2. 创建测试类
    1. 创建线程任务类对象
    2. 创建5个线程对象,并启动。(5个线程对象,相当于5辆汽车)

CarThreadRunnable类

public class CarThreadRunnable implements Runnable {// 创建一个Semaphore对象,限制只允许2个线程获取到许可证private Semaphore semaphore = new Semaphore(2) ;@Overridepublic void run() {                         // 这个run只允许2个线程同时执行try {// 获取许可证semaphore.acquire();System.out.println(Thread.currentThread().getName() + "----->>正在经过十字路口");// 模拟车辆经过十字路口所需要的时间Random random = new Random();int nextInt = random.nextInt(7);TimeUnit.SECONDS.sleep(nextInt);System.out.println(Thread.currentThread().getName() + "----->>驶出十字路口");// 释放许可证semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}}

测试类

public class SemaphoreDemo01 {public static void main(String[] args) {// 创建线程任务类对象CarThreadRunnable carThreadRunnable = new CarThreadRunnable() ;// 创建5个线程对象,并启动。for(int x = 0 ; x < 5 ; x++) {new Thread(carThreadRunnable).start();}}}

控制台输出结果

Thread-0----->>正在经过十字路口
Thread-1----->>正在经过十字路口
Thread-1----->>驶出十字路口
Thread-2----->>正在经过十字路口
Thread-0----->>驶出十字路口
Thread-3----->>正在经过十字路口
Thread-2----->>驶出十字路口
Thread-4----->>正在经过十字路口
Thread-4----->>驶出十字路口
Thread-3----->>驶出十字路口

通过控制台输出,我们可以看到当某一个汽车"驶出"十字路口以后,就会有一个汽车立马驶入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构师考点--数据库系统

大家好。今天我来总结一下数据库系统的相关考点。本考点一般情况下上午场考试占3-5分&#xff0c;下午场案例分析题也会出现。 一、数据库系统 数据&#xff1a;数据库中存储的基本对象&#xff0c;是描述事物的符号记录。数据的种类:文本、图形、图像、音频、视频、学生的档…

AI/ML 数据湖参考架构架构师指南

这篇文章的缩写版本于 2024 年 3 月 19 日出现在 The New Stack 上。 在企业人工智能中&#xff0c;主要有两种类型的模型&#xff1a;判别模型和生成模型。判别模型用于对数据进行分类或预测&#xff0c;而生成模型用于创建新数据。尽管生成式人工智能最近占据了新闻的主导地…

【PyTorch】【机器学习】图片张量、通道分解合成和裁剪

一、导入所需库 from PIL import Image import torch import numpy as np import matplotlib.pyplot as plt二、读取图片 pic np.array(Image.open(venice-boat.jpg))上述代码解释&#xff1a;先用Image.open()方法读取jpg格式图片&#xff0c;再用np.array()方法将图片转成…

loveqq-framework 和 thymeleaf 整合遇到的 th:field 的坑,原来只有 spring 下才有效

相信大家在使用 thymeleaf 的时候&#xff0c;绝大部分都是和 springboot 一块儿使用的&#xff0c;所以 th:field 属性用的很舒服。 但实际上&#xff0c;th:field 只有在 spring 环境下下有用&#xff0c;单独的 thymeleaf 是不支持的&#xff01; 为什么我知道呢&#xff…

DBeaver 数据结果集设置不显示逗号(太丑了)

从Navicat切换过来使用DBeaver&#xff0c;发现类似bigint 这种数据类型在结果集窗口中显示总是给我加上一个逗号&#xff0c;看着很不习惯&#xff0c;也比较占空间&#xff0c;个人觉得这种可读性也不好。 于是我在网上尝试搜索设置方法&#xff0c;可能我的关键词没命中&…

【ARMv8/ARMv9 硬件加速系列 2.4 -- ARM NEON Q寄存器与V寄存器的关系】

文章目录 Q 与 V 的关系向量寄存器 v 的使用赋值操作寄存器赋值总结Q 与 V 的关系 在ARMv8/v9架构中,v寄存器和q寄存器实际上是对相同的物理硬件资源的不同称呼,它们都是指向ARM的SIMD(单指令多数据)向量寄存器。这些寄存器用于高效执行向量和浮点运算,特别是在多媒体处理…

EM算法数学推导

EM算法可以看李航老师的《机器学习方法》、机器学习白板推导、EM算法及其推广进行学习。下文的数学推导出自“南瓜书”&#xff0c;记录在此只为方便查阅。

什么是MQ、优势与劣势、应用场景及模式

目录 一、什么是MQ? 二、RabbitMQ的优势 三、RabbitMQ的劣势 四、RabbitMQ能解决的问题 五、什么时候用到RabbitMQ? 六、RabbitMQ的几种模式 消息队列(Message Queue,MQ)是一种跨进程通信的机制,通过消息传递使不同的应用程序能够相互通信。RabbitMQ是目前流行的开源…

新手充电-boost升压电路解析

1.boost升压电路解析 本篇文章从充放电两个方面来对Boost电路的原理进行了讲解。并在最后补充了一些书本上没有的知识,整体属于较为新手向的文章,希望大家在阅读过本篇文章之后,能对Boost电路的基本原理有进一步了解。 Boost电路是一种开关直流升压电路,它能够使输出电压高…

【Qt基础教程】事件

文章目录 前言事件简介事件示例总结 前言 在开发复杂的图形用户界面(GUI)应用程序时&#xff0c;理解和掌握事件处理是至关重要的。Qt&#xff0c;作为一个强大的跨平台应用程序开发框架&#xff0c;提供了一套完整的事件处理系统。本教程旨在介绍Qt事件处理的基础知识&#x…

HTTP/2 头部压缩 Header Compress(HPACK)详解

文章目录 1. HPACK 的工作原理1.1 静态表1.2 动态表 2. 压缩过程2.1 编码过程2.2 解码过程 3. HPACK 的优势 在HTTP1.0中&#xff0c;我们使用文本的形式传输header&#xff0c;在header中携带cookie的话&#xff0c;每次都需要重复传输几百到几千的字节&#xff0c;这着实是一…

尚品汇-(三)

maven之packaging标签 &#xff08;1&#xff09;项目创建父模块 首先设置 下Maven Maven&#xff1a;仓库地址&#xff1a;这里是腾讯云仓库 作为父模块&#xff0c;src没用&#xff0c;干掉src 这里我们是Maven创建的项目&#xff0c;想要项目变成SpringBoot的项目&#xf…

AI学习指南机器学习篇-高斯朴素贝叶斯算法简介

AI学习指南机器学习篇-高斯朴素贝叶斯算法简介 高斯朴素贝叶斯算法的原理 算法的基本思想 高斯朴素贝叶斯算法是贝叶斯分类器的一种&#xff0c;其基本思想是通过计算输入特征对于每个类别的概率&#xff0c;然后选择具有最高概率的类别作为最终的分类结果。其“朴素”之处在…

程序猿大战Python——面向对象——继承基础

定义类的几种语法 目标&#xff1a;了解定义类的标准语法。 我们知道&#xff0c;可以使用class关键字定义类。 在类的使用中&#xff0c;定义方式有三种&#xff1a; &#xff08;1&#xff09;【类名】 &#xff08;2&#xff09;【类名()】 &#xff08;3&#xff09;【…

MySQL表的增删改查初阶(下篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

在线二维码解码器:将二维码转换成网址链接

在当今数字化时代&#xff0c;二维码&#xff08;QR码&#xff09;已成为一种便捷的信息传递工具。它不仅可以存储大量数据&#xff0c;还能快速分享信息。然而&#xff0c;有时我们需要将二维码中的内容转换为网址链接&#xff0c;以便在浏览器中直接访问。小编将详细介绍如何…

2024头歌数据库期末综合(部分题)

目录 第7关&#xff1a;数据查询三 任务描述 知识补充 答案 第8关&#xff1a;数据查询四 任务描述 知识补充 答案 本篇博客声明&#xff1a;所有题的答案不在一起&#xff0c;可以去作者博客专栏寻找其它文章。 第7关&#xff1a;数据查询三 任务描述 本关任务&#x…

Elasticsearch Nested 查询:处理嵌套文档

在 Elasticsearch 中&#xff0c;嵌套&#xff08;nested&#xff09;字段类型用于表示对象数组&#xff0c;其中每个对象都可以作为独立的文档进行索引。嵌套文档是 Elasticsearch 中一种特殊的文档结构&#xff0c;它允许你在一个字段中存储多个独立的 JSON 对象&#xff0c;…

[C++ STL] list 详解

标题&#xff1a;[C STL] vector 详解 水墨不写bug 正文开始&#xff1a; 一、背景 C语言阶段&#xff0c;我们如果想要使用链表&#xff0c;需要自己手动实现一个链表。这是非常低效的做法&#xff0c;C中的STL中提供了链表“ list ”&#xff0c;我们在包含头文件 <list…

小米15系列将首发骁龙8 Gen4 SoC

高通已确认2024年骁龙峰会定于10月21日举行。在这次峰会中高通将推出其最新的移动芯片Snapdragon 8 Gen4 SoC。著名科技博主DigitalChatStation今天证实&#xff0c;骁龙8 Gen4将以小米15系列首次亮相。这意味着小米15系列将是第一款使用这款新旗舰处理器的手机。 这不是小米第…