信号量模型
如图:
简单来说就是一个队列,一个计数器,三个方法
init()–初始化队列和信号量
down()–信号量-1如果<0,当前线程阻塞,并且进入队列等待。
up()–信号量+1如果>=0,则唤醒一个线程别且把它从当前队列中剔除。
在java当中的Semaphore的使用
1 | static int count; |
信号量是如何保证原子性的呢?
俩个线程都执行s.acquire()是原子性的会修改计数器,假设线程1先执行,所以计数器是0,线程2为-1,因为线程2小于0所以线程2阻塞,并且将当前线程加入到队列中线程1大于等于0所以线程1执行count+=1;这时候线程1执行s.release();计数器为0,大于等于0,所以唤醒队列中的一个线程。
Semaphore的作用
和Lock相比可以同时允许多个线程同时访问临界区。下面的代码是事先了一个队列
1 | class ObjPool<T, R> { |