Semaphore是Java里面另外一个基本的并发工具包类,主要的的作用是用来保护共享资源的访问的,也就是仅仅允许一定数量的线程访问共享资源。Semaphore维护了有限数量的许可证,只有得到了许可证的线程才能进行共享资源的访问,如果得不到许可证,说明当前共享资源的访问已经达到最大限制,所以会挂起当前线程,直到前面的线程处理完任务之后,把许可证归还,后面排队的线程才有机会获取,然后处理任务。
这里面有两个注意点:
(1)大多数时候使用Semaphore都应该是公平模式,默认是非公平模式,如果需要公平模式可以在构造函数里面指定,公平性可以
保证先进先出,不会有线程饥饿问题出现,非公平模式,不保证顺序,吞吐量会更好一些。
(2)共享资源的访问,一般指的是读取,而不是更新,这里面不要做对共享变量的修改,除非你使用同步块来保证。
下面我们来看下Semaphore的构造方法:
Semaphore(int permits)//非公平模式指定最大允许访问许可证数量
Semaphore(int permits,boolean fair)//可以通过第二个参数控制是否使用公平模式

一些常用的方法:
acquire()//申请获取一个许可证,如果没有许可证,就阻塞直到能够获取或者被打断
availablePermits()// 返回当前有多少个有用的许可证数量hasQueuedThreads()//查询是否有线程正在等待获取许可证

drainPermits()//获得并返回所有立即可用的许可证数量
getQueuedThreads()//返回一个List包含当前可能正在阻塞队列里面所有线程对象
getQueueLength()//返回当前可能在阻塞获取许可证线程的数量
hasQueuedThreads()//查询是否有线程正在等待获取许可证
isFair()//返回是否为公平模式
reducePermits(int reduction)//减少指定数量的许可证
reducePermits(int reduction)//释放一个许可证
release(int permits)//释放指定数量的许可证
tryAcquire()//非阻塞的获取一个许可证