`

信号量Semaphore

 
阅读更多

个人学习笔记,如有错误欢迎指正。。

 

信号量Semaphore ,一般用于限制对某些资源固定数量的访问。

 

Semaphore维护了N个的许可,某线程通过acquire()获取一个许可或acquire(int permits) 获取多许可,如果许可数量N大于线程要求的许可数,线程得到许可并可以继续执行。

否则线程阻塞,等待某线程释放许可。

某线程释放许可,许可数量增加并唤醒被阻塞的线程,阻塞线程唤醒后再试着获取许可,获取成功则继续执行否则再次阻塞。

 

Semaphore内部使用AbstractQueuedSynchronizer

 

方法:

 void acquire()
          从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断
 void acquire(int permits)
          从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,否则线程是已中断的
 void acquireUninterruptibly()
          从此信号量中获取许可,在有可用的许可前将其阻塞。
 void acquireUninterruptibly(int permits)
          从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。
 int availablePermits()
          返回此信号量中当前可用的许可数。
 int drainPermits()
          获取并返回立即可用的所有许可。
protected  Collection<Thread> getQueuedThreads()
          返回一个 collection,包含可能等待获取的线程。
 int getQueueLength()
          返回正在等待获取的线程的估计数目。
 boolean hasQueuedThreads()
          查询是否有线程正在等待获取。
 boolean isFair()
          如果此信号量的公平设置为 true,则返回 true。
protected  void reducePermits(int reduction)
          根据指定的缩减量减小可用许可的数目。
 void release()
          释放一个许可,将其返回给信号量。
 void release(int permits)
          释放给定数目的许可,将其返回到信号量。
 String toString()
          返回标识此信号量的字符串,以及信号量的状态。
 boolean tryAcquire()
          仅在调用时此信号量存在一个可用许可,才从信号量获取许可。
 boolean tryAcquire(int permits)
          仅在调用时此信号量中有给定数目的许可时,才从此信号量中获取这些许可。
 boolean tryAcquire(int permits, long timeout, TimeUnit unit)
          如果在给定的等待时间内此信号量有可用的所有许可,并且当前线程未被中断,则从此信号量获取给定数目的许可。
 boolean tryAcquire(long timeout, TimeUnit unit)
          如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被中断,则从此信号量获取一个许可。
分享到:
评论

相关推荐

    python线程信号量semaphore使用解析

    这篇文章主要介绍了python线程信号量semaphore使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.semaphore信号量原理 多线程同时运行,能提高程序的...

    信号量Semaphore了解过吗?

    难堪的一次面试: 信号量Semaphore了解过吗?没有

    Java 信号量Semaphore的实现

    主要介绍了Java 信号量Semaphore的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    semaphore的使用.pdf

    关于Android变成中的信号量semaphore,在使用过程中我们往往搞不清楚其信号量的申请和使用。这里主要针对信号量初始值为零的情况做介绍,其他情况不做讨论。初始值为零的情况较少使用,部分代码中的这个情况往往让...

    使用信号量(Semaphore)实现线程的同步

    使用信号量(Semaphore)实现线程的同步

    Java信号量Semaphore

    Semaphore  Semaphore分为单值和多值两种,前者只能被一个线程获得,...单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场

    vxworks多任务(task和semaphore信号量及事件)例程.zip

    资源包含了vxworks多任务(task和semaphore信号量及事件)的相关编程例子,通过创建多任务的简单例子,帮助大家了解taskSpawn函数、信号量semaphore、以及事件event的使用方法。

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

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

    信号量(Semaphore)

    信号量(Semaphore)哲学家进餐问题(the dining philosophers problem)---------------------------程序

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

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

    SmallRTOS_LwIP_STM32F4_ALIENTEK

    以便LwIP借助于SmallRTOS的任务Task、消息队列MsgQ、信号量Semaphore、互斥信号量Mutex实现网络数据的通信及同步;该例程在STM32F4板卡上实现了TCP协议的服务器端功能,IP地址192.168.1.30,端口号为8088。上电启动...

    操作系统复习习题.docx

    //A、B的资源信号量,同时又是它们的互斥信号量 semaphore SC=0; //C的资源信号量(用于与A同步) semaphore SD=0; //D的资源信号量(用于与B同步) begin parbegin process A: //进程A的算法描述 { while(true) { 取一...

    java并发之Semaphore信号量.md

    Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...

    JAVA多线程--信号量(Semaphore)_.docx

    JAVA多线程--信号量(Semaphore)_.docx

    Java并发编程(23)并发新特性-信号量Semaphor

    Java并发编程(23)并发新特性—信号量Semaphore(含代码)编程开发技术共3页.pdf.zip

    一个小的java Demo , 非常适合Java初学者学习阅读.rar

    信号量 Semaphore,执行器服务 ExecutorService, 线程池执行者 ThreadPoolExecutor,定时执行者服务 ScheduledExecutorService, 使用 ForkJoinPool 进行分叉和合并,锁 Lock,读写锁 ReadWriteLock 原子性长整型 ...

    Linux内核源码深度解析与开发实战视频.zip

    19:可睡眠锁:信号量semaphore_rec 20:可睡眠锁:读写信号量rwsem_rec 21:可睡眠锁:完成变量completion_rec 22:可睡眠锁:SRCUsleepable_read-copy-update_rec 23:原子操作_rec 24:内存屏障_rec ...........

    python多线程DAY04.txt

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

    生产者消费者简要说明

    //定义信号量 semaphore mutex = 1; semaphore full = 0; semaphore empty = N; //定义共享缓冲区 buf_type buffer[N]; main(…) { … //创建生产者和消费者线程 CreateThread(…, Progucer, …); CreateThread(…,...

Global site tag (gtag.js) - Google Analytics