Semaphore信号量源码解析

一、用法

信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

 

二、源码:

 

构造方法,设置可以同时运行的线程数量。这里可以设置是公平的,还是非公平的。这里先说非公平的。

 

acqurie()

本质是AQS的方法,

这个方法的本质就是看业务线的try的方法是否返回值小于0,如果是,就挂起这个线程。

 

而这个try方法是看上述这个方法返回值是否大于等于0。

这个方法就是每次调用acquire的时候就把并发数见一,当减到负数的时候,就会去执行挂起线程的方法了。这也就满足了之前使用规则,只有满足要求规定的并发数的线程能运行,其他线程等待。

这里的公平只有一个区别

在获取state锁的时候,看等待队列是不是为空或者自己是等待队列的头结点如果是,就可以获得state锁,如果不是,,就老老实实入队吧。所以这个是公平的。具体可以参考(ReetrantLock看AQS那篇文章)

 

 

是否许可的本质就是调用tryReleaseShared方法

 

这个方法就是根据想要释放的许可数量,把state的值加上几。之后会有doReleaeShared方法唤醒head下第一个需要被唤醒的节点。

 

这里很多东西都没有细述了,因为关于AQS部分在前面文章都说了,理解了前面的,这个就很简单。

 

你可能感兴趣的:(java多线程)