一文学会Semaphore(信号量),android开发者选项说明

本文详细介绍了Semaphore(信号量)的工作原理,重点解析了其依赖的AQS(AbstractQueuedSynchronizer)机制,包括如何实现不公平锁和公平锁。Semaphore在加解锁操作中,通过CAS更新状态,根据剩余资源决定是否允许线程获取锁。文章强调了掌握AQS对于理解Semaphore的重要性,并提醒读者Semaphore不支持重入,避免可能导致死锁的使用方式。
摘要由CSDN通过智能技术生成

AQS基础

Semaphore是一种共享锁,实现依赖于AQS。对于锁,包含两部分知识,一部分是如何加解锁,另一部分是把锁分配给谁。AQS解决了把锁分配给谁的问题,Semaphore就可以聚焦于如何加解锁上。

掌握AQS将使Semaphore如何运转变得非常简单,没掌握也不影响对于本文的理解。

AQS原理可以参考:一文了解AQS

这里,需要了解AQS是如何运转的:

AQS运行概要.png

  1. 当申请锁,即调用了与acquire()类似语义的方法时,AQS将询问子类是否上锁成功,成功则继续运行。否则,AQS将以Node为粒度,记录这个申请锁的请求,将其插入自身维护的CLH队里中并挂起这个线程
  2. 在CLH队列中,只有最靠近头节点的未取消申请锁的节点,才有资格申请锁
  3. 当线程被唤醒时,会尝试获取锁,如果获取不到继续挂起;获取得到则继续运行
  4. 当一个线程释放锁,即调用release()类似语义的方法时,AQS将询问子类是否解锁成功,有锁可以分配,如果有,AQS从CLH队列中主动唤起合适的线程,过程为2、3
  5. 如果需要等待条件满足再去申请锁,即调用了wait()类似语义的方法时,在AQS中表现为,以Node为粒度,维护一个单向等待条
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值