一、用法
信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
二、源码:
构造方法,设置可以同时运行的线程数量。这里可以设置是公平的,还是非公平的。这里先说非公平的。
acqurie()
本质是AQS的方法,
这个方法的本质就是看业务线的try的方法是否返回值小于0,如果是,就挂起这个线程。
而这个try方法是看上述这个方法返回值是否大于等于0。
这个方法就是每次调用acquire的时候就把并发数见一,当减到负数的时候,就会去执行挂起线程的方法了。这也就满足了之前使用规则,只有满足要求规定的并发数的线程能运行,其他线程等待。
这里的公平只有一个区别
在获取state锁的时候,看等待队列是不是为空或者自己是等待队列的头结点如果是,就可以获得state锁,如果不是,,就老老实实入队吧。所以这个是公平的。具体可以参考(ReetrantLock看AQS那篇文章)
是否许可的本质就是调用tryReleaseShared方法
这个方法就是根据想要释放的许可数量,把state的值加上几。之后会有doReleaeShared方法唤醒head下第一个需要被唤醒的节点。
这里很多东西都没有细述了,因为关于AQS部分在前面文章都说了,理解了前面的,这个就很简单。