线程安全——AQS——锁优化

1 避免死锁

2 减小锁的持有时间

3 减小锁的粒度

4 锁的分离(读写锁)

5 尽量使用无锁的操作,如原子操作(Atomic系列类),volatile关键字

源代码解析:

acquire(int): 此方法是独占模式下线程获取共享资源的顶层入口。如果获取到资源,线程直接返回,否则进入等待队列,直到获取到资源为止,且整个过程忽略中断的影响。这也正是lock()的语义,当然不仅仅只限于lock()。获取到资源后,线程就可以去执行其临界区代码了。

下面是acquire()的源码,也是AQS的核心    

 tryAcquire()尝试直接去获取资源,如果成功则直接返回;

addWaiter()将该线程加入等待队列的尾部,并标记为独占模式;

acquireQueued()使线程在等待队列中获取资源,一直获取到资源后才返回。如果在整个等待过程中被中断过,则返回true,否则返回false。

如果线程在等待过程中被中断过,它是不响应的。只是获取资源后才再进行自我中断selfInterrupt(),将中断补上。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
AQS(AbstractQueuedSynchronizer)是Java并发包中的一个基础框架,用于实现同步器(synchronizer)和(lock)等机制。AQS提供了公平和非公平两种实现方式。 公平:公平是指多个线程按照申请的顺序来获取,即先到先得的原则。当一个线程释放时,等待时间最长的线程将获得的访问权。在公平中,通过一个队列来维护等待获取线程顺序,每个线程在申请时会先检查队列中是否有等待线程,如果有,则进入等待队列并等待自己的机会获取。 非公平:非公平是指多个线程获取的顺序是不确定的,不保证按照申请的顺序来获取。在非公平中,当一个线程释放时,下一个获取线程可能是刚刚释放线程本身,也可能是其他正在等待的线程,这样可以减少线程切换的开销。 公平和非公平在性能上有一定的差异。公平由于需要维护一个有序的等待队列,增加了一些额外的开销,可能导致整体的性能较低。而非公平则没有这个开销,可能会导致某些线程长时间等待,出现“饥饿”的情况。 在实际应用中,选择公平还是非公平取决于具体的场景和需求。如果对于线程获取的顺序有严格要求,需要保证公平性,可以选择公平。如果对于性能要求较高,允许线程获取的顺序不确定,可以选择非公平

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

择业

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值