信号量(Semaphore),实现方法的并发限量使用

实验九*基于信号量机制的并发程序设计 一、实验目的 (1)回顾操作系统进程、线程的有关概念,针对经典的同步、互斥、死锁与饥饿问题进行并发程序设计。 (2)了解互斥体对象,利用互斥与同步操作编写读者-写者问题的并发程序,加深对P(即semWait)、V(即semSignal)原语以及利用P、V原语进行进程间同步与互斥操作的理解。 二、总体设计(含背景知识或基本原理与算法、或模块介绍、设计步骤等) 背景知识: 读者写者问题:有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若是某个写进程和其他进程同 阅读详情

原文地址: http://www.java2000.net/p11622

上次使用了自己设计的结构,实现了一个方法,只能被2个线程同时使用

一个方法最多2个线程同时使用的JAVA实现

经网友提醒,发现用信号量才是正途,我这里只给出测试代码和运行效果,其它的大家自己看吧

  1. package concurrent;
  2. import java.util.concurrent.Semaphore;
  3. /**
  4.  * 信号量,实现方法的多线程限量使用。
  5.  * 
  6.  * @author 老紫竹 JAVA世纪网(java2000.net)
  7.  * 
  8.  */
  9. public class SemaphoreTest extends Thread {
  10.   public static void main(String[] args) {
  11.     for (int i = 0; i <= 10; i++) {
  12.       new SemaphoreTest().start();
  13.     }
  14.   }
  15.   public void run() {
  16.     int i = 2;
  17.     OnlyTwo ot = new OnlyTwo();
  18.     while (i-- > 0) {
  19.       System.out.printf("[%3d]%d=%d/n",this.getId(),System.currentTimeMillis(),+ot.getSomthing());
  20.       try {
  21.         Thread.sleep(200);
  22.       } catch (InterruptedException e) {
  23.         e.printStackTrace();
  24.       }
  25.       ot.returnSomthing();
  26.     }
  27.   }
  28. }
  29. class OnlyTwo {
  30.   private static final int MAX_AVAILABLE = 3;
  31.   private static final Semaphore available = new Semaphore(MAX_AVAILABLE, false);
  32.   private static int NUM = 1;
  33.   /**
  34.    * 执行方法。
  35.    * 
  36.    * @return
  37.    */
  38.   public int getSomthing() {
  39.     try {
  40.       available.acquire();
  41.     } catch (InterruptedException e) {
  42.       e.printStackTrace();
  43.     }
  44.     return NUM++;
  45.   }
  46.   /**
  47.    * 归还
  48.    */
  49.   public void returnSomthing() {
  50.     available.release();
  51.   }
  52. }

运行效果
[  9]1225837305234=1
[ 10]1225837305250=3
[  8]1225837305250=2
[  8]1225837305468=4
[ 10]1225837305468=6
[  9]1225837305468=5
[ 12]1225837305250=7
[ 14]1225837305250=8
[ 16]1225837305250=9
[ 16]1225837305875=10
[ 12]1225837305875=12
[ 14]1225837305875=11
[ 18]1225837305250=13
[ 13]1225837305250=15
[ 11]1225837305250=14
[ 18]1225837306281=16
[ 13]1225837306281=18
[ 11]1225837306281=17
[ 15]1225837305250=19
[ 17]1225837305250=20
[ 17]1225837306687=21
[ 15]1225837306687=22

Social-Auto-Upload实战:如何用Python+Playwright实现抖音/B站/小红书一键三连发? 本文详细介绍了如何使用Python和Playwright框架构建Social-Auto-Upload自动化上传工具,实现抖音、B站、小红书等平台的一键多发布。通过模拟真实用户操作和Cookie管理技术,该工具能有效解决内容创作者跨平台发布的重复劳动问题,提升工作效率。 阅读详情

相关推荐

基于CY7C68013A芯片的USB2.0设计

基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不...

zhangningning1996的博客 1万+

操作系统学习-6. 信号量

操作系统学习-6. 信号量 写在前面:这一篇博客将讨论信号量(Semaphores)机制。将学习三种基本类型的信号量,然后将用信号量实现互斥与前趋两种进程关系。

zy2317878的博客 4394

两轮差速机器人运动学模型

两轮差速底盘 1.1、底盘说明 两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。 主要底盘有: 1、Turtlebot; 2、扫地机器人; 3、无人仓AGV小车; 4、轮椅; 底盘主要特点: 1、控制简单、里程计计算简单。 2、只能给定X方向速度、Z轴方向角速度。 1.2、底盘运动学分析 1.2.1、底盘模型 图1.2.1 常见的两轮差速底盘模型 1.2.2、机器人本身约束方程(物理特性) 图1.2.2 a 左侧是车的两个

su_fei_ma_su的博客 3万+

信号量与并发控制

我们知道在网络请求时,会用到大量的异步线程。但异步线程的开辟并不是没有代价的,在硬件资源有限的情况下,有时候就需要对这些异步线程做一些控制,防止线程过多造成资源浪费;或者线程之间存在依赖关系,一个线程的执行必须等另外一个线程完成,而信号量(semaphore)就是 GCD 中用来做并发控制(即同步)的一种机制。 GCD 中的信号量包含了 3 个函数: dispatch_semaphore_cr...

kmyhy的专栏 2042

从外包到转正:一个华为OD亲历者的真实工作体验与避坑指南

本文分享了一位华为OD员工从外包到转正的真实经历与实用建议。通过详细解析华为OD的日常工作、转正核心指标、机试备考技巧及职场突围策略,为读者提供了一份全面的避坑指南。特别针对机试E卷的高频考点和刷题方法,给出了具体的数据分析和实战经验。

weixin_33686714的博客 691

数字频率计设计中的常见误区:从VHDL代码到硬件实现的避坑指南

本文深入探讨了数字频率计从VHDL代码到FPGA硬件实现过程中的关键误区与解决方案。重点分析了闸门时间生成的精度与资源平衡、控制时序设计中的竞争冒险规避,以及如何利用EDA工具进行综合、时序约束与调试,确保设计稳定可靠。文章为开发者提供了从仿真成功到硬件可用的实战避坑指南。

spark7igniter的博客 213

并发中的信号量Semaphore

在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作用,通过对信号量的不同操作,可以分别实现进程间的互斥与同步。当然它也可以用于多线程的控制,我们完全可以通过使用信号量来自定义实现类似Java中的synchronized、wait、notify机制。 Java并发包中的信号量Semaphore实际上是一个功能完毕的计数信号量,从概念上讲,它维护了一个许可集合,对控制一定

wjbtian的专栏 1025

手把手教你学Simulink--基于多能源系统协同控制的复杂场景实例:氢燃料电池+锂电池混合动力电动汽车能量管理仿真

本文介绍了基于Simulink的氢燃料电池与锂电池混合动力电动汽车能量管理系统的建模与仿真方法。系统包含驾驶循环输入、燃料电池子系统、锂电池子系统、能量管理、电机驱动等模块,通过协同控制优化能源分配。详细说明了从模型创建到各子系统设置的7个步骤,并提供了MATLAB代码示例。该仿真可评估不同工况下的系统响应速度、能量利用效率和电池寿命等性能指标,为混合动力汽车的能量管理策略设计和优化提供参考。

MHD0815的博客 238

题目:信号量实现进程同步

1 实验说明 利用信号量解决生产者-消费者问题。 2 解决方案 进程同步是操作系统多进程/多线程并发执行的关键之一, 进程同步指为完成共同任务的并发进程基于某个条件来协调它们的活动, 这是进程之间发生的一种直接制约关系, 生产者-消费者问题是典型的进程同步问题, 其本质是如何控制并发进程对有界共享主存区的访问。生产者进程生产产品, 然后将产品放置在一个空缓冲区中供消费者进程消费。...

weixin_43442778的博客 6436

【Zephyr存储专题】06_存储块设备驱动开发(Nand Flash)

本文介绍了基于Zephyr系统的NAND Flash驱动实现方案,重点阐述了Flash驱动模型的核心架构和关键API设计。

zero的博客 1802

C#从入门到精通(35)—如何防止winform程序因为误操作被关闭

我们在开发的上位机软件运行起来以后,一般在右上角都有一个关闭按钮,正常情况下点击关闭按钮就能关闭软件,但是不排除我们不想关闭软件,但是因为不小心把鼠标点到了关闭按钮,如果这是一个正在生产的机器,突然关闭软件可能会导致产品损坏,那么我们如何去解决这个误操作的问题呢,本文就来讲解解决方案!

qq_34059233的博客 676

java常用的并发工具类-Semaphore

SemaphoreSemaphore是 Java 并发包 () 中提供的一个非常常用的并发工具类,它用于控制对共享资源的访问,通过允许多个线程同时访问一个资源但限制并发访问的最大数量来实现流量控制。Semaphore是一种计数信号量,通常用于实现限流、资源池管理等功能。

Flying_Fish_roe的博客 1294

推荐11个顶级的Claude Code Skills

ClaudeCode的Skills系统为程序员提供了11个强大的AI辅助工具,包括代码审查、重构建议、单元测试生成、API文档自动生成、性能分析、安全扫描、数据库迁移脚本生成、CI/CD配置、依赖管理、ER图生成和日志分析等功能。这些"技能包"可大幅提升开发效率,从代码质量到协作沟通全方位优化工作流程。用户可根据需求选择2-3个核心功能开始尝试,熟练后还可自定义Skills。该系统需要配合Anthropic的API使用,建议先在小型项目测试再应用于核心业务。

分享AI、区块链技术及应用,未来已来 1847

AQS-用购票的方式理解信号量(Semaphore)

在有些情况下,由于资源的限制,程序无法支持无限量的线程并发,因此引入信号量(Semaphore),只有获取信号量凭证的线程才允许执行。 1用购票理解信号量(Semaphore) 就好比我们乘坐火车一样,座位数量(信号量大小)是一定的。只有买到车票(获取信号量)的人才允许上车,当车票售完了,没有车票的人(没有获取信号量)是不允许上车的。只有等到有人下车,或者退票(释放持有信号量)后,等待的人才可以购票(获取信号量)上车: 其实现方式也非常简单,是基于java提供的AQS同步器框架实现的,因此只要理解了AQS

qq_38951372的博客 316

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Semaphore 有什么用

Semaphore 是用于控制多线程/进程对共享资源访问的同步机制。通过维护计数器实现资源管理,提供 wait() 和 signal() 操作协调线程执行顺序。主要解决并发场景下的互斥访问(二进制信号量)和资源数量限制(计数信号量)问题,防止数据竞争和系统资源耗尽。

weixin_46084191的博客 841

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

AphasiaBank 英语失语症语音识别与失语检测:ESPnet E-Branchformer/WavLM 配方全解

AphasiaBank 是一个面向失语症(Aphasia)临床研究的英语口语语料库。本指南基于 ESPnet 仓库中 [egs2/aphasiabank/asr1](https://link.gitcode.com/i/4f4a83faedb05142e60dd98092fd9379) 的完整配方,系统讲解从 CHAT 转写数据准备、字符级 ASR 训练、Aphasia 标签注入(Tag-base

gitblog_00332的博客 1014

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java信号灯_java高级之信号灯Semaphore

1、Semaphore概念Semaphore是Java1.5之后提供的一种同步工具,Semaphore可以维护访问自身线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,通过acquire()获取一个许可,如果没有就等待,而release()释放一个许可。Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同...

weixin_39801158的博客 278

C++并发编程:基于互斥锁与条件变量实现线程安全的信号量

在并发编程中,信号量是一种用于控制多线程对共享资源访问的同步机制,其核心原理是通过一个计数器来管理资源的可用数量。与互斥锁不同,信号量允许多个线程同时访问资源,从而实现限量共享。在C++标准库中,虽然未直接提供信号量实现,但开发者可以通过组合互斥锁和条件变量来构建更安全的信号量,这不仅能加深对底层同步原语的理解,还能提升代码的健壮性。信号量在工程实践中具有重要价值,常用于线程池的并发度控制、生产者-消费者模型中的有界缓冲区以及限制并行任务数量等场景。本文通过实现一个工业级的C++信号量,详细解析了其设计哲学

weixin_34224941的博客 322

Semaphore源码解析

Semaphore继承关系 实现了Serializable 接口,同时含有一个私有Sync对象字段 public class Semaphore implements java.io.Serializable { private static final long serialVersionUID = -3222578661600680210L; /** All mec...

thebigdipperbdx的博客 271

Java高级之信号灯Semaphore

1、Semaphore概念 Semaphore是Java1.5之后提供的一种同步工具,Semaphore可以维护访问自身线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。 Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去

wystyle1的专栏 6734

java并发工具类

title : 每日深耕,勤练不缀之java并发工具类 带你走进并发的世界 回顾:我们在IO中讲的用线程池,只是相对于几百访问量的并发,那些只是我们练习时的Demo, 我们通常所说的并发包就是java.util.concurrent及其子包,集中了Java并发的各种基础工具类: 提供了比synchronized更加高级的各种同步结构,包括CountDownLatch、CyclicBarrier、Semaphore等,可以更加丰富的多线程操作。 线程安全的容器 ConcurrentHashMap,无.

qq_42762824的博客 179

C#线程同步--限量使用

问题抽象:当某一资源同一时刻允许一定数量的线程使用的时候,需要有个机制来阻塞多余的线程,直到资源再次变得可用。线程同步方案:Semaphore、SemaphoreSlim、CountdownEvent方案特性:限量供应;除所有者外,其他人无条件等待;先到先得,没有先后顺序 1、Semaphore类 用于控制线程的访问数量,默认的构造函数为initialCount和maximumCoun...

weixin_34390105的博客 141

java高级之信号灯Semaphore

1、Semaphore概念 Semaphore是Java1.5之后提供的一种同步工具,Semaphore可以维护访问自身线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,通过acquire()获取一个许可,如果没有就等待,而release()释放一个许可。 Semaphore实现的功能就类似厕所有5个坑,假如有10个人...

weixin_30909575的博客 174

java生产者消费者限量版_Java实现生产者和消费者的5种方式

1、wait()和notify()方法的实现2、可重入锁ReentrantLock的实现3、阻塞队列BlockingQueue的实现4、信号量Semaphore的实现5、管道输入输出流PipedInputStream和PipedOutputStream实现1、wait()和notify()方法的实现public class ProducerConsumerWithWaitNofity {priva...

weixin_31862047的博客 137

吃透AQS与三大并发工具:别再分不清CountDownLatch、CyclicBarrier、Semaphore

所有并发工具,本质都是:修改state变量 + 操控队列线程阻塞/唤醒的不同策略而已。原理通用,只是玩法不同,这就完美解释了,为什么三个工具看起来功能相似,实则完全不能混用。技术从不是死记硬背,而是理解底层逻辑、匹配业务场景。AQS和三大并发工具,看似简单,却是区分初级CRUD和中高级开发的核心分水岭。吃透这篇内容,下次面试被问到、线上遇到并发问题,你将不再含糊,从容应答、精准排障。

weixin_43144460的博客 386
上一篇: 老紫竹JAVA基础培训(5),IF语句的使用
下一篇: 新单位工作一个月了,应该写点东西总结一下了
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值