您当前的位置: 首页 > 

Linux小百科

暂无认证

  • 1浏览

    0关注

    1185博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

信号量Semaphore一篇文章叫你明白

Linux小百科 发布时间:2021-05-18 09:52:37 ,浏览量:1

信号量Semaphore一篇文章叫你明白信号量Semaphore一篇文章叫你明白 已经习惯了阿里面试官的冷笑:用过Semaphore吧,不妨说说?

本质就是 信号量模型,模型图如下:

其中的 计数器 和 等待队列 对外部是透明的,仅能通过提供的三大方法访问它们。信号量Semaphore一篇文章叫你明白信号量Semaphore一篇文章叫你明白 详细说说哪三大方法?

init()

用于设置计数器的初始值。

down()

计数器-1。若此时计数器0 意味着没有阻塞的线程,所以只有 ≤0 时才需要唤醒一个等待的线程。

down()、up()应配对使用,并按序使用:

先调用down(),获取锁 执行处理完后,调用up(),释放锁 若信号量init值为1,并发场景下应该不会出现>0情况,除非故意调先用up(),但这也失去了信号量的意义。

注意,这些方法都是原子性的,由信号量模型的实现方保证。JDK里的信号量模型就是由Semaphore实现,Semaphore保证了这三个方法都是原子操作。

talk is cheap,show me code? 

信号量Semaphore一篇文章叫你明白信号量Semaphore一篇文章叫你明白 信号量模型中的down()、up()最早被称为P操作和V操作,信号量模型也称PV原语。还有的人会用semWait()和semSignal()表达它们,叫法不同,语义都相同。JUC的acquire()、release()分别对应down()和up()。

如何使用信号量?

就像信号灯,必须先检查是否为绿灯才能通过。比如累加器,count+=1操作是个临界区,只允许一个线程执行,也就是说要保证互斥。信号量Semaphore一篇文章叫你明白信号量Semaphore一篇文章叫你明白 假设线程t1、t2同时访问add(),当同时调用acquire时,由于acquire是个原子操作,仅会有一个线程(假设t1)把信号量里的计数器减为0,t2则是将计数器减为-1:

对t1,信号量里面的计数器的值是0,≥0,所以t1不会被阻塞,而是继续执行 对t2,信号量里面的计数器的值是-1,

关注
打赏
1665632672
查看更多评论
立即登录/注册

微信扫码登录

0.2339s