![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JDK源码
文章平均质量分 94
记录源码阅读的专栏。
程序员小潘
Java开发工程师,现居杭州,CSDN博客专家,热衷于分享计算机编程相关知识,欢迎关注~
展开
-
LinkedBlockingQueue源码分析
1. 前言阻塞队列BlockingQueue非常适合用来在多个线程之间共享数据和传递消息,假设现在主业务已经完成了,还有N多个副业务需要处理,传统方式是主业务线程直接和副业务线程打交道,调用副业务的方法。这种方式是强耦合的,主业务线程必须知道副业务线程的存在。一般来说,我们希望系统设计是低耦合的,只有低耦合,才能有高容错。因此,我们并不希望主副业务线程间互相知道对方的存在。这时,我们可以考虑在两者之间加一个数据缓冲区,主业务完成后,线程往数据缓冲区里丢一条消息,副业务线程从缓冲区中读取消息并执行自己原创 2021-08-14 15:38:35 · 1105 阅读 · 0 评论 -
ArrayBlockingQueue源码分析
1. 前言队列Queue是一种【先进先出】的线性表,而BlockingQueue是一种比较特殊的队列——阻塞队列。它的阻塞体现在两方面:1.使用同步锁来保证线程安全,抢不到锁的线程是阻塞的。2.当队列为空时,消费者线程必须阻塞,等待生产者生产数据,反之,队列满时,生产者线程必须阻塞,等待消费者线程消费数据。因此,它非常适合用来做【生产者-消费者】模型,不同线程之间通过队列作为信息交流的媒介,而不用知道对方的存在,以此来实现解耦。队列作为数据缓冲区,还可以缓解生产消费双方性能不对等的情况。Blo原创 2021-08-10 20:10:35 · 317 阅读 · 0 评论 -
CopyOnWriteArrayList源码分析
1. 前言提到Java语言中的List容器,最先想到的应该是ArrayList和LinkedList,使用频率最高了。但是很可惜,它俩都不是线程安全的容器类,如果多线程并发操作同一个容器对象,就会出现问题。【如何创建一个线程安全的List?】有两种方式,一种是使用Collections.synchronizedList()将线程不安全的List包装成线程安全的。它的原理很简单,使用【装饰者模式】将不安全的方法加上synchronized关键字来保证同步。优点是实现简单,缺点是性能较差。第二种原创 2021-08-09 20:18:23 · 253 阅读 · 0 评论 -
JDK中那些不得不读的源码
ArrayList源码导读。LinkedList源码导读。JDK7-HashMap源码解析。ThreadLocal源码解析。AQS源码导读。原创 2020-12-08 23:23:06 · 1466 阅读 · 0 评论 -
FutureTask源码导读
FutureTask是在JDK1.5被引入的,又是并发大神`Doug Lea`的杰作。它代表的是一个异步计算任务,它将在未来的某个时刻完成计算并获得一个计算结果。当线程调用`get()`去获取结果时,如果计算完毕,则立马返回,否则线程会被阻塞,直到计算完成。原创 2020-12-08 23:22:06 · 252 阅读 · 0 评论 -
CountDownLatch源码导读
CountDownLatch是在JDK1.5被引入的,又是并发大神`Doug Lea`的杰作。它的作用是让一组线程在等待其他N个线程到达一个统一的状态时再继续执行。原创 2020-12-08 22:15:57 · 284 阅读 · 0 评论 -
CyclicBarrier源码导读
CyclicBarrier也被称为“栅栏”、“屏障”,从名字就看的出来,它是可以被循环使用的。CyclicBarrier的作用是当一组线程全部都到达一个状态时,再全部同时执行。原创 2020-12-08 19:43:33 · 224 阅读 · 0 评论 -
Semaphore源码导读
Semaphore,又称“信号量”,它的作用是对资源同一时间允许访问的线程数量做限制的,通常被用来做【限流】。原创 2020-12-07 21:03:44 · 228 阅读 · 0 评论 -
LongAdder源码导读
前言JDK8提供了一个性能更好的长整型原子类:java.util.concurrent.atomic.LongAdder。在高并发下,它有着比AtomicLong更好的性能,代价是会消耗更多的内存空间。有了AtomicLong,为啥还要引入LongAdder?AtomicLong是通过volatile+CAS的方式来保证并发安全的,它只有一个value值,所有的线程都对这一个value值操作,也就意味着这个value是热点数据。随着并发量越来越高,CAS操作失败的概率也会越来越大,会有越来越多的线程原创 2020-12-06 15:05:02 · 235 阅读 · 0 评论 -
AtomicLong源码导读
AtomicLong是JDK5开始提供的,它的作用是:对长整型进行原子操作。类似的原子类还有:AtomicBoolean、AtomicInteger等,它们的实现原理都是一样的。在原子类出现之前,要想让一个long类型的数值完成自增操作保持原子性,那么只能通过加synchronized或者显式锁,这种解决方式不仅会让代码编写更加复杂,而且效率也不高。原子类的出现,提供了另一种解决思路来保证操作的原子性,那就是:CAS,关于CAS的详细说明可以看笔者的另一篇文章:《关于CAS的一点理解和思考》。对变量加原创 2020-12-06 12:51:02 · 573 阅读 · 1 评论 -
ReentrantLock源码导读
ReentrantLock是JDK5开始提供的Java实现的显式锁,它是一个可重入锁,依赖于AQS实现。它使用AQS的state变量作为锁的重入次数,每lock()一次state就自增1,每unlock()一次state就自减1,当state减至0时,就代表锁释放了。当锁释放后,AQS会调用unparkSuccessor()去唤醒队列中的后继节点去竞争锁,锁竞争失败的线程AQS会创建一个和线程绑定的Node节点,入队并Park挂起线程。线程同步的细节在AQS类中就已经实现,ReentrantLock只需原创 2020-12-04 23:10:27 · 300 阅读 · 0 评论 -
ArrayList源码导读
ArrayList底层是基于数组来实现的,相较于数组,它支持动态的扩容,元素的插入和删除变得很方便。相较于LinkedList,它支持快速随机访问,通过下标可以快速定位到元素,访问速度非常快。原创 2020-12-04 21:05:58 · 626 阅读 · 0 评论 -
LinkedList源码导读
LinkedList底层是一个双向链表的数据结构,它的插入和删除非常的快速,只需要修改对应节点的`next`和`prev`的指向即可,不像ArrayList需要大量的移动元素的位置。原创 2020-12-04 21:53:12 · 329 阅读 · 0 评论 -
AQS源码导读
我想挑战一下我的软肋:AQS源码导读。原创 2020-11-20 20:51:25 · 9293 阅读 · 5 评论 -
JDK7-HashMap源码解析
为了方便阅读和写注释,笔者将HashMap源码单独拷出来了,推荐大家也这么做,阅读起来更加轻松,Debug也很方便,更重要的是,你可以修改源码来测试。继承关系图阅读源码建议采用自上而下的结构,建议先看Map接口、然后AbstractMap抽象类、最后HashMap。整体结构分层Map接口定义Map具备的功能,使用内部接口Entry来对单个映射关系进行封装,Entry是Map的基本组成单...原创 2019-12-21 19:21:00 · 3338 阅读 · 0 评论 -
ThreadLocal源码解析
Java并发编程的学习过程中,一定绕不过ThreadLocal,在实际开发中,ThreadLocal的应用场景还是很丰富的:线程间数据的隔离。Session的管理。事务的管理。参数的隐式传递(PageHelper)。Dubbo的RpcContext。为了更好的理解ThreadLocal原理,笔者记录一下源码阅读的过程,错误之处,还望读者指出,不胜感激。源码解析1、threadLocalHashCodeThreadLocal实例会被当做Key存放到Thread的ThreadLocalM原创 2020-11-23 23:00:09 · 616 阅读 · 3 评论