第十四讲:Semaphore(信号量)
含义
类似生活中红绿灯,红灯停,绿灯行;线程能不能执行,需要看信号量是否允许;
信号量模型
1)一个计数器,一个等待队列,三个方法;
2)在模型中,计数器与等待队列是透明的,可以通过init()、up()、down()方法访问;
3)init():设置计数器初始值;
down():计数器值减1;如果此时计数器值小于0,则当前线程将被阻塞,否则当前
线程可以继续执行;
up():计数器值加1;如果此时计数器值大小于或者等于0,则唤醒等待队列中的一个
线程,并将其从等待队列中移除;
累加器
1)acquire() 等价于 down():
两个线程T1,T2同时访问addOne()方法,同时调用原子操作acquire();
线程T1将计数器减为0,可继续执行;
线程T2将计数器减为-1,则被阻塞;
2)release()等价于up():
线程T1执行release()操作,计数器值加为0,T2将会被唤醒;
T2在T1执行完临界区代码之后才获得进入临界区执行的机会,从而保持互斥性;
限流器
1)Semaphore可以允许多个线程访问同一个临界区;
2)假设对象池大小为10,信号量计数器初始化为10;
前10个线程调用acquire()方法,都能继续执行,相当于通过了信号灯,而其他线程
则会阻塞在acquire()方法上;
对于通过信号灯的线程,为每个线程分配一个对象t(pool.remove(0)),分配完之后
会执行一个回调函数func,函数的参数是分配的对象t;
执行完回调函数之后,会释放对象(pool.add(t)),同时调用release()方法更新信号
量的计数器,如果此时信号量里计数器的值小于等于0,那么说明有线程在等待,此
时会自动唤醒等待的线程;