JDK源码直击

7 篇文章 0 订阅

 

JDK源码其实没什么好总结的,纯粹看个人,总结一下比较重要的源码:

(1)List、Map、Set实现类的源代码

(2)ReentrantLock、AQS的源代码

(3)AtomicInteger的实现原理,主要能说清楚CAS机制并且AtomicInteger是如何利用CAS机制实现的

(4)线程池的实现原理

(5)Object类中的方法以及每个方法的作用
转自作者:Java黎先生
链接:https://www.jianshu.com/p/83e4c4fdd6eb

ReentrantLock

public class ReentrantLock implements Lock,Serialize

ReentrantLock底层使用了CAS+AQS队列实现

CAS是一种无锁算法。有3个操作数:内存值V、旧的预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

AQS是一个用于构建锁和同步容器的框架。

AQS使用一个FIFO的队列(也叫CLH队列,是CLH锁的一种变形),表示排队等待锁的线程。队列头节点称作“哨兵节点”或者“哑节点”,它不与任何线程关联。其他的节点与等待线程关联,每个节点维护一个等待状态waitStatus。结构如下图所示:

  1. ReentrantLock先通过CAS尝试获取锁,
    1. 如果此时锁已经被占用,该线程加入AQS队列并wait()
    2. 当前驱线程的锁被释放,挂在CLH队列为首的线程就会被notify(),然后继续CAS尝试获取锁,此时:
      1. 非公平锁,如果有其他线程尝试lock(),有可能被其他刚好申请锁的线程抢占
      2. 公平锁,只有在CLH队列头的线程才可以获取锁,新来的线程只能插入到队尾。

(注:ReentrantLock默认是非公平锁,也可以指定为公平锁)

 ReentrantLock的2个构造函数

public ReentrantLock() {
    sync = new NonfairSync(); //默认,非公平
}
 
public ReentrantLock(boolean fair) {
    sync = fair ? new FairSync() : new NonfairSync(); //根据参数创建
}

 

总结

0.每一个ReentrantLock自身维护一个AQS队列记录申请锁的线程信息;

1.通过大量CAS保证多个线程竞争锁的时候的并发安全;

2.可重入的功能是通过维护state变量来记录重入次数实现的。

3.公平锁需要维护队列,通过AQS队列的先后顺序获取锁,缺点是会造成大量线程上下文切换;

4.非公平锁可以直接抢占,所以效率更高;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值