多线程(29)Semaphore

Semaphore(信号量)是一种常用的并发控制技术,用于管理对一组资源的访问控制。信号量的核心是一个计数器,表示可用资源的数量。计数器的值可以初始化为任意值,如果初始化为1,则成为一个互斥锁(Mutex)。信号量提供了两个主要方法,acquire()(获取)和release()(释放),用于线程间的同步控制。

工作原理

  1. acquire()

    • 当线程尝试通过acquire()方法获取资源时,信号量的计数器会减1。
    • 如果计数器的值大于等于0,说明资源可用,线程可以继续执行。
    • 如果计数器的值小于0,则说明资源不足,线程会被阻塞,直到有其他线程释放资源。
  2. release()

    • 线程通过调用release()方法来释放它持有的资源,这会使信号量的计数器加1。
    • 如果有线程因为资源不足而被阻塞,释放资源后,这些线程中的一个或多个(取决于释放的资源数量和信号量的公平性策略)会被唤醒,尝试再次获取资源。

公平性

  • Semaphore支持两种公平性策略:公平模式和非公平模式。
  • 在公平模式下,线程获取资源的顺序与它们请求访问的顺序相同,能够防止线程饿死(即无限期等待)。
  • 在非公平模式下,请求访问的顺序并不保证线程获取资源的顺序,这可能导致某些线程较快获取资源,而其他线程等待时间较长。

用途

  • 控制资源的并发访问:信号量常用于限制对资源的并发访问数,确保系统的稳定性和性能。
  • 实现生产者-消费者模式:通过两个信号量控制生产者和消费者的同步,一个信号量控制可用资源数,另一个控制可用空间数。
  • 线程同步:虽然Semaphore主要用于资源的并发控制,但也可以用作线程间的同步机制。

示例代码

下面是一个简单的Semaphore使用示例,演示如何控制对某个资源的并发访问:

import java.util.concurrent.Semaphore;public class SemaphoreExample {private static final int MAX_PERMITS = 3;private final Semaphore semaphore = new Semaphore(MAX_PERMITS, true); // 公平模式public void accessResource() {try {semaphore.acquire(); // 尝试获取一个许可// 模拟访问共享资源System.out.println(Thread.currentThread().getName() + " is accessing the shared resource.");Thread.sleep(1000); // 模拟操作耗时} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {semaphore.release(); // 释放一个许可System.out.println(Thread.currentThread().getName() + " is releasing the shared resource.");}}public static void main(String[] args) {SemaphoreExample example = new SemaphoreExample();for (int i = 0; i < 10; i++) {new Thread(example::accessResource).start();}}
}

在这个示例中,我们创建了一个具有3个许可的Semaphore,确保最多只有3个线程可以同时访问某个共享资源。每个线程在访问资源前需要通过acquire()方法获取许可,完成后通过release()方法释放许可。这种方式保证了资源的安全访问和高效利用。

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

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

相关文章

iOS使用CoreML运用小型深度神经网络架构对图像进行解析

查找一个图片选择器 我用的是ImagePicker 项目有点老了&#xff0c;需要做一些改造&#xff0c;下面是新的仓库 platform :ios, 16.0use_frameworks!target learnings dosource https://github.com/CocoaPods/Specs.gitpod ImagePicker, :git > https://github.com/KevinS…

Python之Opencv进阶教程(1):图片模糊

1、Opencv提供了多种模糊图片的方法 加载原始未经模糊处理的图片 import cv2 as cvimg cv.imread(../Resources/Photos/girl.jpg) cv.imshow(girl, img)1.1 平均值 关键代码 # Averaging 平均值 average cv.blur(img, (3, 3)) cv.imshow(Average Blur, average)实现效果 1.2…

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟…

基于Spring Boot的餐厅点餐系统

基于Spring Boot的餐厅点餐系统 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 部分系统展示 管理员登录界面 用户注册登录界面 …

​如何使用ArcGIS Pro进行洪水淹没分析

洪水淹没分析是一种常见的水文地理信息系统应用&#xff0c;用于模拟和预测洪水事件中可能受到淹没影响的地区&#xff0c;这里为大家介绍一下ArcGIS Pro进行洪水淹没分析的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&…

Python学习笔记-Flask接收post请求数据并存储数据库

1.引包 from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy 2.配置连接,替换为自己的MySQL 数据库的实际用户名、密码和数据库名 app Flask(__name__) #创建应用实列 app.config[SQLALCHEMY_DATABASE_URI] mysqlpymysql://ro…

优化 Nginx 处理 504 Gateway Timeout 错误

简介 504 Gateway Timeout 错误表示 Nginx 在指定的时间内没有从上游服务器收到响应。这可能是由于上游服务器处理时间过长或网络连接问题造成的。 调整 Nginx 参数 为了解决 504 错误&#xff0c;可以调整以下 Nginx 参数&#xff1a; **proxy_read_timeout&#xff1a;**指…

如何判断驱动中probe是否执行

在我们调试驱动程序的时候需要查看probe函数是否执行&#xff0c;我们只需要在其probe函数写一个printk函数即可&#xff0c;在驱动和设备匹配之后就会执行这个probe里面的打印函数 但是前提我们需要降低内核的打印级别&#xff0c;否则是看不到的&#xff0c;我们可以降到最低…

mac电脑maven配置环境变量

1、下载maven https://maven.apache.org 2、配置环境变量 vim .bash_profile JAVA_HOME/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home PATH$JAVA_HOME/bin:$PATH export JAVA_HOME export PATH#maven export MAVEN_HOME/Users/haines/desktop/work/java/a…

鸿蒙OS开发实例:【应用事件打点】

简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志&#xff0c;难以识别其中的关键信息。因此&#xff0c;应用开发者需要一种数据打点机制&#xff0c;用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。 HiAppEvent是在系统层面…

适用于 Linux 的 Windows 子系统安装初体验

1、简述 Windows Subsystem for Linux (WSL) 是 Windows 的一项功能&#xff0c;允许您在 Windows 计算机上运行 Linux 环境&#xff0c;而无需单独的虚拟机或双重启动。 WSL 旨在为想要同时使用 Windows 和 Linux 的开发人员提供无缝且高效的体验。 使用 WSL 安装和运行各种 L…

【javaScript】DOM编程入门

一、什么是DOM编程 概念&#xff1a;DOM(Document Object Model)编程就是使用document对象的API完成对网页HTML文档进行动态修改&#xff0c;以实现网页数据和样式动态变化的编程 为什么要由DOM编程来动态修改呢&#xff1f;我们就得先理解网页的运行原理&#xff1a; 如上图&a…

Map之computeIfAbsent

Map之computeIfAbsent Absent /ˈbsənt , bˈsent/ ab相反s存在ent…的 从map中获取key对应的value,如果value不存在就用提供的Function创建一个新的value,然后存入map,最后返回 优化前 Map<String, Set<Pet>> statistics new HashMap<>(); Set<Pet…

IO流:字节流、字符流、缓冲流、转换流、数据流、序列化流 --Java学习笔记

目录 IO流 IO流的分类 IO流的体系 字节流&#xff1a; 1、Filelnputstream(文件字节输入流) 2、FileOutputStream(文件字节输出流) 字节流非常适合做一切文件的复制操作 复制案例&#xff1a; try-catch-finally 和 try-with-resource 字符流 1、FileReader(文件字符…

ALPHA开发板上的PHY芯片驱动:LAN8720驱动

一. 简介 前面文章了解到&#xff0c;Linux内核是有提供 PHY通用驱动的。 本文来简单了解一下ALPHA开发板上的 PHY网络芯片LAN8720的驱动。是 LAN8720芯片的公司提供的 PHY驱动。 二. ALPHA开发板上的PHY芯片驱动&#xff1a;LAN8720驱动 我 们 来 看 一 下 LAN8720A 的 …

输入url到页面显示过程的优化

浏览器架构 线程&#xff1a;操作系统能够进行运算调度的最小单位。 进程&#xff1a;操作系统最核心的就是进程&#xff0c;他是操作系统进行资源分配和调度的基本单位。 一个进程就是一个程序的运行实例。启动一个程序的时候&#xff0c;操作系统会为该程序创建一块内存&a…

HDLbits 刷题 --Always nolatches

学习: Your circuit has one 16-bit input, and four outputs. Build this circuit that recognizes these four scancodes and asserts the correct output. To avoid creating latches, all outputs must be assigned a value in all possible conditions (See also always…

【HTML】简单制作一个3D动画效果重叠圆环

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;CSS的…

【chatGPT】我:在Cadence Genus软件中,出现如下问题:......【1】

我 在Cadence Genus中&#xff0c;出现如下问题&#xff1a;Error&#xff1a;A command argument did not match any of the acceptable command option. [TUI-170] [set_db] :‘/’ is not a legal option for the command. 该如何解决 ChatGPT Cadence Genus的错误消息 “…

探索Java多线程编程的奥秘

在当今互联网时代&#xff0c;软件系统的高性能和高并发已经成为了各类应用的标配。而在Java领域&#xff0c;多线程编程作为实现高性能和高并发的重要手段&#xff0c;备受开发者们的关注。本文将带您深入探索Java多线程编程的奥秘&#xff0c;介绍其基本概念、常见问题和最佳…