并发编程中的信号量Semaphore

信号量Semaphore**:**
 
Semaphore表明一种信号量,用来控制某一资源被同时访问的个数。该类的构造函数接受一个int类型的参数,参数的值表明了最多被同时访问的个数(当然这个值是可以通过release方法增加的)。还有一个参数设置是否公平获得许可证,公平的话先到先得,默认是不公平许可证。
 
Semaphore类有以下几个重要的方法:
 
①   acquire和tryAcquire方法:这两个方法主要是获取一个许可证,acquire获取一个许可证(不管有没有获取到),tryAcquire获取许可证并判断是否获取到。
 
②   release方法发行(或释放)一个许可证,释放之后其它等待的线程就可以获取到该许可证了,注意该方法也可以增加一个许可证。
 
Semaphore是一个典型的生产者-消费者模式,生产者通过release方法产生许可证提供给消费者进行使用,消费者通过tryAcquire方法消费生产者产生的许可证(当然消费者使用完后可以归还,比如车位;也可以不归还,比如面包…)
 
Semaphore的使用场合类似于停车位:总共有N个停车位。开始的时候停车位是空的,当有车子进来时拿走一个许可证并停车,当车位被占满时其它车进来就拿不到许可证了,只能进行等候,当有车子离开时释放一个许可证,其它等候的车子就可以拿到许可证进入了。
 
Semaphore还可以使用在生产面包的场景:面包师每次生产出一轮面包(假定为100个),消费者购买面包。当100个都卖完的时候,其它消费者只好排队等待。至于有些消费者插队的情况,那就是公平与不公平的的信号量了。