标签:thread release new log 核心 detail 自旋 port details
acquire()
获得信号量的许可.release()
释放其持有的信号量.acquire()
请求获得信号量时,若信号量有可用的许可时,线程获得许可,并且当前可用的许可减1.若许可集已经分配完,则线程进入等待状态,直到其他线程释放许可才有机会再获得许可.release()
释放信号量时,当前可用的信号量加1.new Semaphore(int permits)
设置初始的许可数.acquire(int permits)
获取指定数量的许可,若获取成功,则执行,否则线程阻塞等待条件满足.acquire(0)
,表明不需要获得许可即可继续执行.若后续使用release()
,则信号量的总许可数加1.acquire(0)
可继续执行,若使用acquire()
或请求正整数个许可,则线程一直处于请求状态.Semaphore(int permits) // 给定许可数量的非公平信号量
Semaphore(int permits, boolean fair) // 给定许可数量,设置公平的信号量
void acquire() // 从信号量中获得一个许可,若不足,则线程阻塞
void acquire(int permits) // 获得指定数量的许可
int availablePermits() // 获得当前可用的许可数
int drainPermits() // 摧毁剩下的许可
protected Collection<Thread> getQueuedThreads() // 返回等待获取的线程
Semaphore有一个基于AQS的内部类Sync.基于这个类,分别实现了公平模式(FairSync)和非公平模式(NonFairSync).
若初始化为1,则最多只有一个可用的许可证,可作为互斥锁使用,被称为二进制信号量.
其只有两个状态:
* 允许可用.
* 不允许可用
不同于锁,二进制信号量可以由持有者以外的线程释放.(可用于死锁恢复)
非公平模式
不保证线程获取许可的顺序.
一个调用acquire()
的线程可能先于等待很久的线程获得许可.(将新线程放在等待队列头)
公平模式
保证获得许可的顺序为线程调用acquire()
方法的顺序.中
内部类Sync继承于AQS(维护同步队列,控制同步状态).
实现两种锁:
默认构造的为非公平锁.
细节:
注:
公平锁
参考:
标签:thread release new log 核心 detail 自旋 port details
原文地址:https://www.cnblogs.com/truestoriesavici01/p/13235985.html