juc并发编程

1. 内存屏障

读屏障写屏障组成的四大屏障
在这里插入图片描述

2、AQS

抽象队列同步器。起内部有个tryAcquire()方法来获取锁

架构
在这里插入图片描述

2.1 ReentrantLock

AQS实现之一。

模型图:
在这里插入图片描述

  • 重要的两个构造:
    在这里插入图片描述
    NonfairSycFairSync是继承了Sync的类。

  • ReentrantLock其内部的Sync属性(静态内部类)就是实现了AQS的。
    在这里插入图片描述

2.1.2 lock的时候

  • 使用ReentrantLock执行lock()方法时会执行到Sync内部的抽象lock()方法。其具体实现在FairSyncNonFairSync中,最终都会调用到acquire()方法,这个acquire()方法在AQS中。
    注意:在非公平锁中,如果是第一个线程的话,就不会去执行acquire(),也就是说,获取到了锁就不会去执行。
    在这里插入图片描述
    在这里插入图片描述

  • 公平锁与非公平锁尝试获取锁时:
    ①:公平锁在尝试获取锁时,会去判断前面是否有排队的线程。
    ②:在如下代码中,else if同时也体现了可重入锁的思想。
    在这里插入图片描述

总结:执行lock()方法时

  1. 根据公平与非公平,执行逻辑不一样,但是之后都会在执行到acquire()
  2. acquire()方法中(在AQS中),会执行tryAcquire()去获取锁,获取不到就会执行到LockSupport.park(this)将当前线程挂起。
  3. 获取到了锁就回去改变state的值

2.1.2 unlock的时候

  • ReentrantLock.unlock实际上是通过Sync去执行AQS中的release()方法
  • 在用AQS执行release()时,
    • 先去tryRelease(),这个用的其中的Sync类实现的release方法,也就是说没有区分公平与否。这个方法会把AQS中标识的当前独占线程的标识设置为空exclusiveOwnerThread
    • tryRelease()成功,后续再判断,然后会执行unparkSuccessor()unpark下一个线程。

AQS中的静态内部类Node示意图
在这里插入图片描述

2.2 AQS中的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值