`

Semaphore实现信号灯

 
阅读更多

 

lSemaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。
ØSemaphore实现的功能就类似厕所有5个坑,假如有十个人要上厕所,那么同时能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中的任何一个人让开后,其中在等待的另外5个人中又有一个可以占用了。
Ø另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。
l单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。
 
public static void main(String[] args) {
  ExecutorService service = Executors.newCachedThreadPool();
  final  Semaphore sp = new Semaphore(3);
  for(int i=0;i<10;i++){
   Runnable runnable = new Runnable(){
     public void run(){
     try {
      sp.acquire();
     } catch (InterruptedException e1) {
      e1.printStackTrace();
     }
     System.out.println("线程" + Thread.currentThread().getName() +
       "进入,当前已有" + (3-sp.availablePermits()) + "个并发");
     try {
      Thread.sleep((long)(Math.random()*10000));
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     System.out.println("线程" + Thread.currentThread().getName() +
       "即将离开");     
     sp.release();
     //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
     System.out.println("线程" + Thread.currentThread().getName() +
       "已离开,当前已有" + (3-sp.availablePermits()) + "个并发");     
    }
   };
   service.execute(runnable);   
  }
 }
分享到:
评论

相关推荐

    Linux信号灯C语言编程示例(包含信号灯回滚,信号等取值和初始化操作)

    本示例着重讲解如何使用C语言实现信号灯,包括信号灯的初始化、信号灯回滚、信号等待和信号释放等操作。下面将详细介绍这些概念及其在`mysem.c`和`mysem.h`文件中的实现。 首先,信号灯分为两种类型:互斥量(互斥...

    信号灯模型线程实现方法

    在系统级芯片(System-on-a-Chip, SOC)上实现信号灯模型,可以有效地协调多个任务或线程,确保资源的安全访问和避免竞态条件。在本案例中,我们将详细探讨如何通过`Method`方法在SOC上实现这一模型。 首先,我们...

    信号灯法实现生产者与消费者模式.rar

    具体实现上,我们可以使用Python的`threading`库中的`Semaphore`类来创建一个信号灯。信号灯的计数值可以表示缓冲区的空闲位置。当生产者尝试将产品放入缓冲区时,它会调用`acquire()`方法,这会减少信号灯的计数值...

    linux c 进程间通信 信号灯 程序源码

    本文将详细讲解Linux C编程中的一种进程间通信方式——信号灯(Semaphore),并结合提供的程序源码进行解析。 信号灯是同步原语之一,它允许进程在执行过程中对某些资源进行互斥访问或同步操作。信号灯由两个基本...

    Linux多线程环境信号灯的使用

    在多线程环境中,信号灯(Semaphore)是一种同步机制,用于控制多个线程对共享资源的访问,避免竞态条件的发生。本文将深入探讨在Linux Red Hat 7.0环境下如何使用信号灯,并以提供的`test.c`源代码为例进行解析。 ...

    Unix下信号灯和共享内存的使用方法.zip_信号灯_共享内存

    信号灯分为两种类型:二进制信号灯(Binary Semaphore)和计数信号灯(Counting Semaphore)。 1. **二进制信号灯**:仅能取值0或1,类似于互斥锁,用于保护临界区,防止多个进程同时进入。 2. **计数信号灯**:...

    Linux环境下多线程编程及信号灯同步互斥应用指南

    此外,还探讨了如何使用 semaphore 实现进程间的同步与互斥,通过实例解析展示了经典的多线程和进程间通讯问题,如生产者消费者模型、信号灯的应用场景及解决办法。 适合人群:对于有一定Linux系统操作基础的学生...

    linux中一个程序的两个线程的同步(c语言实现)

    在 Linux 操作系统中,可以使用 sys/sem.h 头文件中的函数来实现信号灯,并使用 sys/shm.h 头文件中的函数来实现共享缓冲区。本实验结果表明,使用信号灯可以确保线程安全,避免数据不一致和其他错误。

    linux中实现的三个并发程序的誊抄(c语言)

    在Linux操作系统中,实现并发程序通常涉及到进程同步和通信,其中信号灯(Semaphore)是一种重要的同步机制。在给定的程序示例中,通过C语言编写了四个源程序:main.c、get.c、copy.c和put.c,这些程序共同协作完成...

    使用Java模拟交通信号灯.zip

    为了确保信号灯状态的正确切换,开发者可能会使用`synchronized`关键字、`wait()`和`notify()`方法,或者使用`java.util.concurrent`包中的高级并发工具,如`Semaphore`或`CyclicBarrier`。这些工具可以帮助避免竞态...

    Java进阶教程,面试大全,包罗万象

    Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何...

    Java进阶教程,面试大全

    Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何...

    go-semaphore:在Go语言中实现基本信号量和时间限制信号量

    例子基本信号量BasicSemaphore是一个管理固定数量的并发任务的信号灯。 func TestSemaphore ( t * testing. T ) { permit := 3 sem := semaphore . NewSemaphore ( permit ) sem . Aquire ( 1 ) if sem . Available ...

    CenaFilosofos:使用交通信号灯解决哲学家的晚餐问题

    为了解决这个问题,我们可以利用Java编程语言中的交通信号灯机制来实现一种解决方案,这就是CenaFilosofos项目的核心所在。 首先,我们来理解交通信号灯机制。在现实生活中,交通信号灯通过红、黄、绿三种颜色的...

    操作系统课设报告.docx

    然后,报告详细介绍了使用多线程解决读者阅览问题的步骤,包括创建reader函数、使用信号灯判断座位是否被坐满、实现上锁操作、找座位坐下、阅读、打印座位信息、当前读者离开座位、读者注销等步骤。报告最后还对课程...

    信号灯:使用ETS的快速信号灯

    总结来说,“信号灯:使用ETS的快速信号灯”这个主题涉及了Erlang和Elixir中通过ETS实现信号量的基本概念、操作以及其在并发控制中的应用。了解这些知识有助于开发者更好地理解和处理并发编程中的同步问题,提高系统...

    抽烟者问题

    5. **编程实现**:在Linux环境下,可以使用`&lt;sys/sem.h&gt;`头文件提供的函数实现信号灯操作。例如,`sem_init`初始化信号灯,`sem_wait`对应P操作,`sem_post`对应V操作。程序设计需要考虑到边界条件,比如防止供应者...

    ucosii对于信号量,互斥信号量,事件标志组的个人理解[收集].pdf

    1. 互斥信号量(Mutex Semaphore): 互斥信号量的主要作用是确保共享资源在同一时刻只能被一个任务使用,以避免数据竞争和混乱。例如,在打印机的例子中,任务1开始打印《静夜思》,它会先检查互斥信号量的状态,...

    java线程并发semaphore类示例

    Semaphore,顾名思义,就像是一个信号灯或通行证,用来管理一组有限的资源。在Java中,Semaphore类提供了对并发线程进行计数的许可管理,允许我们限制同时访问特定资源的线程数量。这在处理并发任务时非常有用,例如...

    您的办公桌的信号灯-项目开发

    5. "1_batteryholder.stl"、"semaphore.stl"、"3_body.stl"、"semaphore_lid.stl"、"2_base.stl" 都是3D打印模型文件,分别代表电池座、信号灯主体、灯罩、主体和底座等部件。 6. "TrafficLight_ATTiny13.zip" 是一...

Global site tag (gtag.js) - Google Analytics