7-30小记

第十四讲: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,那么说明有线程在等待,此

            时会自动唤醒等待的线程;

            

       

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值