Semaphore实现共享锁
简介
在多线程环境下用于协调各个线程, 以保证它们能够正确、合理的使用公共资源 信号量维护了一个许可集,我们在初始化Semaphore时需要为这个许可集传入一个数量值, 该数量值代表同一时间能访问共享资源的线程数量。 线程可以通过acquire()方法获取到一个许可,然后对共享资源进行操作, 如果许可集已分配完了,那么线程将进入等待状态, 直到其他线程释放许可才有机会再获取许可,线程释放一个许可通过release()方法完成
DEMO了解其用法
Semaphore实现互斥锁
简介
在初始化信号量时传入1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。 这通常也称为二进制信号量,因为它只能有两种状态:一个可用的许可或零个可用的许可。 按此方式使用时,二进制信号量具有某种属性(与很多 Lock 实现不同),即可以由线程释放“锁”,而不是由所有者(因为信号量没有所有权的概念)
DEMO了解其用法
Semaphore提供的方法
- Semaphore(int permits) 创建具有给定的许可数和非公平的公平设置的Semaphore
- Semaphore(int permits, boolean fair) 创建具有给定的许可数和给定的公平设置的Semaphore,true即为公平锁
- void acquireUninterruptibly() 从此信号量中获取许可,不可中断
- int availablePermits() 返回此信号量中当前可用的许可数
- int drainPermits() 获取并返回立即可用的所有许可
- protected Collection<Thread> getQueuedThreads() 返回一个 collection,包含可能等待获取的线程
- int getQueueLength() 返回正在等待获取的线程的估计数目
- boolean hasQueuedThreads() 查询是否有线程正在等待获取
- boolean isFair() 如果此信号量的公平设置为 true,则返回 true
- boolean tryAcquire() 仅在调用时此信号量存在一个可用许可,才从信号量获取许可
- boolean tryAcquire(long timeout, TimeUnit unit) 如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被中断,则从此信号量获取一个许可
内部原理分析
类图