`
tonysmith
  • 浏览: 171017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

信号量机制 Semaphore

阅读更多

操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java并发库Semaphore可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。

Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁ReentrantLock也可以实现该功能,但实现上要负责些,代码也要复杂些。

下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。

package concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class TestSemaphore {
  public static void main(String[] args) {
    // 线程池
    ExecutorService exec = Executors.newCachedThreadPool();
    // 只能5个线程同时访问
    final Semaphore semp = new Semaphore(5);
    // 模拟20个客户端访问
    for (int index = 0; index < 20; index++) {
      final int NO = index;
      Runnable run = new Runnable() {
        public void run() {
          try {
            // 获取许可
            semp.acquire();
            System.out.println("Accessing: " + NO);
            Thread.sleep((long) (Math.random() 10000));
            // 访问完后,释放
            semp.release();
          catch (InterruptedException e) {
          }
        }
      };
      exec.execute(run);
    }
    // 退出线程池
    exec.shutdown();
  }
}

运行结果:
Accessing: 0
Accessing: 1
Accessing: 2
Accessing: 3
......
Accessing: 17
Accessing: 18
Accessing: 19

分享到:
评论

相关推荐

    信号量同步等待机制 semaphore wait-and-signal

    介绍临界资源的访问机制,有Semaphore,signal,mutex等

    ucosIII信号量多值信号量二值信号量互斥信号量

    信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问 (临界资源指同一时刻只能有有限个访问),常用于协助一组相互竞争的任务来访问临界资源。运行机制可以理解为:信号量是...

    linux信号量机制

    信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于0时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数...

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 b: 创建多个线程 c: 多线程访问同一资源 d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 ...I: 信号量 semaphore 解决线程同步问题

    OS-semaphore.rar_Semaphore_semaphore. windows

    在windows系统下的os平台中,各个任务间是通过信号量来同步共同资源的,本文就信号量机制进行了详细的讲解,

    信号量:信号量组件管理信号量,一种提供对共享资源的独占访问的机制

    信号量组件 信号量组件管理,一种提供对共享资源的独占访问的机制。 资源资源 并在

    03_FreeRTOS_Bin_Semaphore.rar

    信号量基本上用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制实现的。FreeRTOS中有4种信号量: - 二进制信号量 - 计数信号量 - 互斥信号量 - 递归信号量 本文介绍: 二进制信号量的使用方法

    生产者-消费者模型模拟进程调度,带报告,课程设计

    2、用信号量机制解决进程(线程)的同步与互斥问题。 二、实验目的 1.掌握基本的同步互斥算法,理解生产者和消费者模型。 2.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 3.学习使用Windows ...

    Linux内核的同步机制

     在主流的Linux内核中包含了几乎所有现代的操作系统具有的同步机制,这些同步机制包括:原子操作、信号量(semaphore)、读写信号量(rw_semaphore)、spinlock、BKL(Big Kernel Lock)、rwlock、brlock(只包含在...

    详解Linux进程间通信——使用信号量

    而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。 信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待...

    lab4-171830635俞星凯1

    背景知识信号量机制内核维护Semaphore这一数据结构,并提供P,V这一对原子操作,其中W用于阻塞进程自身在该信号量上,R用于释放一个阻塞在该信号量上的进程,

    操作系统经典习题.pdf

    进程同步,信号量机制实现 设有 6 个程序 s1 ,…, s6 ,它们在并发系统中执行时如图所示的制 约关系, 试用 wait 和 signal 原语来实现它们之间的同步。 (10 分) Var a, b, c, d, e, f, g, h; semaphore:= 0, 0, ...

    node-mysql-semaphore:使用MySQL的分布式锁定机制

    允许您使用MySQL在群集的Node.js环境中生成信号量。 这对于诸如cron作业或长时间运行的任务等只希望在单个实例上发生的事情很有用。 要求:MySQL服务器 安装 npm install mysql-semaphore --save 初始化: 有关...

    进程间通信

    semget函数创建一个新的信号量或是获得一个已存在的信号量键值。 semop函数用来改变信号量的值(包含P操作和V操作)。 semctl函数允许信号量信息的直接控制(包含初始化信号灯和删除信号灯)。 事实上,为了获得...

    《Visual C++范例大全》随书光盘 第十一章

    实例268——使用信号量(Semaphore)实现线程的同步 实例269——使用多线程进行文件搜索 实例270——获取当前系统的所有进程 实例271——实现应用程序在系统中只能运行一个实例 实例272——获取所有打开窗口...

    python多线程DAY04.txt

    2. 信号量 Semaphore() acquire() 删除 release() 增加 get_value() 获取 3. 同步互斥机制 : 解决了多个进程或者线程对共享资源的争夺 Event e.set e.clear e.wait Lock lock.acquire() lock.release() 4...

    操作系统课程设计(生产者-消费者,存储管理,虚拟存储器

    2、用信号量机制解决进程(线程)的同步与互斥问题。 二、实验目的 1.掌握基本的同步互斥算法,理解生产者和消费者模型。 2.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 3.学习使用Windows ...

    Android本地图片加载多点触控放缩以及Listview优化

    3.Semaphore:信号量机制,它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。在该项目中主要是保证在线程池中有正在执行的任务+准备执行的任务之和是一定的值。 4.异步加载图片以及图片的裁剪和旋转。...

    COS-II.rar_cos_cos rtos_rtos任务_μCOS-II

    ΜC/OS-II最多支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持Semaphore(信号量)、Mailbox(邮箱)、Message Queue(消息队列)等多种常用的进程间通信机制。与大多商用RTOS不同的是,μC/...

Global site tag (gtag.js) - Google Analytics