- 博客(191)
- 收藏
- 关注

原创 深入理解线程池(ThreadPoolExecutor)——细致入微的讲源码。
本文解析线程池的源码,同时会详细说明以下这些问题。1、线程池状态是怎么控制的2、创建线程是怎么防止并发的3、核心线程数和最大线程数,具体干啥的4、哪些地方用了 AQS 框架5、线程最长存活时间,是怎样控制线程生命周期的6、addWorker 时,传一个空任务,是干嘛的
2021-02-13 17:19:39
1142
7

原创 彻底弄懂ReentrantLock —— 超详细的原码分析
java1.6 之前, synchronized效率很低,AQS框架就是解决并发问题的首选。我们从 ReentrantLock入手,看下AQS怎么解决并发问题的。如下代码,存在多线程并发问题// TODO用 ReentrantLock 加锁,来看下效果,这里我们用公平锁ReentrantLock lock = new ReentrantLock(true); lock.lock();...
2020-10-07 00:15:33
3208
16
原创 ReentrantReadWriteLock到底怎么玩儿?
本文写了ReentrantReadWriteLock 基本使用方法,从源码层面讲解了,读锁逻辑,写锁逻辑,读锁计数等等。
2023-04-02 17:11:56
828
原创 CompletableFuture 源码分析 thenCombine & thenCompose
CompletableFuture 源码分析,1、supplyAsync 提交任务到线程池, 2、thenCombine 全并两个异步任务,3、thenCompose 更复杂的合并两个任务
2023-03-25 20:14:39
1144
原创 CompletableFuture 的 allOf 方法底层原理是什么
CompletableFuture 底层原理,通过 allOf / anyOf 两个方法,详细分析源码
2023-03-20 01:51:48
5033
10
原创 BitSet源码解析,位运算玩的真六
BitSet 也就是位图,底层用 long 数组,用 位 来存储数据。本文介绍 BItSet 常用的方法,及源码解析
2022-07-20 23:20:41
2452
3
原创 BUG探究 ConCurrentHashMap 源码中的 bug
ConCurrentHashMap 源码的 bug 分析,为什么源码错了,也能正常使用!
2022-03-17 23:58:11
1143
原创 ThreadLocal 怎么就内存溢出了,看源码究竟是怎么写的。
ThreadLocal 源码解析、内存溢出问题探究、ThreadLocal 方法的使用
2021-12-27 00:08:11
766
原创 线程池提交任务 execute 和 submit,到底选哪个?
关于线程池,写过两篇文章《线程池基本原理详解》、《定时类线程池工作原理》。这两篇文章,从源码的角度,分析的很详细,文章也很长。这一篇,介绍一个很小的点,使用线程池时,任务提交的方法,execute 和 submit 这两个到底怎么选?一、示例代码先说 Runnable任务,可以这么写 Runnable runnable = new Runnable() { @Override public void run() { System.o
2021-08-22 12:32:12
2254
1
原创 ScheduledThreadPool 源码解析——定时类线程池是如何工作的
延时类的线程池,是如何工作的?scheduleAtFixedRate、scheduleWithFixedDelay 有什么区别,如何实现。
2021-04-03 23:23:04
1778
原创 ConCurrentHashMap并发环境时,如何计数的?—— sumCount()、fullAddCount()
ConCurrentHashMap 在并发环境下的计数问题。主要有两个手段。针对源码,本文进行详细的说明
2021-03-22 19:30:12
1567
4
原创 ConCurrentHashMap并发环境下,如何扩容?
ConCurrentHashMap 扩容的源码分析。 sizeCtl 参数的具体应用
2021-03-17 22:30:32
730
2
原创 ConCurrentHashMap源码解析——高并发时,触发扩容:addCount() 方法
ConCurrentHashMap 会自动扩容,而且可能多个线程参与扩容。本篇主要讲下,触发扩容的源码。
2021-03-14 09:50:22
1081
3
原创 图解 ConCurrentHashMap ——从源码层面,弄清楚它是怎么控制并发的
ConCurrentHashMap的基本原理,从 插入元素、扩容等等方面,弄明白它是怎么控件并发的。
2021-03-10 23:20:22
1391
16
原创 图解 HashMap 源码——逐行分析源码,面试再也不怕被问HashMap了
HasmMap 的底层原理,讲解源码中的 put、 remove、get方法。
2021-02-27 20:55:00
425
原创 HashMap 与 ConCurrentHashMap简单原理
HashMap 和ConcurrentHashMap 的简化版的实现原理。 解析源码前先理解它俩共同的玩法。
2021-02-24 22:33:23
402
2
原创 浅谈阻塞队列 BlockingQueue
关于阻塞队列,具体写过几篇源码剖析的文章。常用的这几个阻塞队列,都逐一解析了一遍。本篇做一个总括的介绍。.
2021-02-17 10:06:16
328
2
原创 SynchronousQueue源码解析(非公平模式)
上篇文章,介绍了 SynchronousQueue 的公平模式(源码分析)。这篇文章,从源码入手,解析 非公平模式。如果你对SynchronousQueue不熟悉,可以先看我的这篇文章(图解SynchronousQueue)。一、初始化 SynchronousQueue<Integer> queue = new SynchronousQueue<>(); public SynchronousQueue() { this(false); }
2021-01-12 22:56:24
407
原创 SynchronousQueue源码解析(公平模式)
上篇文章中,画图解释了,SynchronousQueue 的工作原理。这篇文章,详细的解析源码(图解 SynchronousQueue原理)。默认你已经读了上篇文章,这篇文章重点说源码。以公平模式为例一、初始化 SynchronousQueue<Integer> queue = new SynchronousQueue<>(true); public SynchronousQueue(boolean fair) { transferer = fair
2021-01-10 18:01:35
748
1
原创 图解 SynchronousQueue(java 8)
SynchronousQueue 是一个特殊的阻塞队列,在线程池中有所应用(CachedThreadPool)。源码不太好理解,今天多画几张图,来说明它的底层原理。一、示例 public static void main(String[] args) throws Exception { SynchronousQueue<Integer> queue = new SynchronousQueue<>(); Thread t1 = new
2021-01-10 11:21:09
1877
7
原创 图解PriorityBlockingQueue源码(java 8)
PriorityBlockingQueue 是一个带有优先级的阻塞队列。基本原理和前面介绍的ArrayBlockingQueue类似。在看这篇文章之前,你可以先仔细看下这篇文章——ArrayBlockingQueue源码解析PriorityBlockingQueue和ArrayBlockingQueue一样,初始化时,可指定队列的大小。不同的是,前者可以自动扩容,而后者不会。另一个很大不同是,前者可以实现优先出队,后者则是先进先出。比如有这么一个场景,一个市场上陆陆续续来了很多卖苹果的。这时来
2021-01-04 20:58:35
460
原创 图解LinkedBlockingQueue源码(java 8)
LinkedBlockingQueue是一个阻塞队列,采用双锁技术,性能较 ArrayBlockingQueue有很大的提高。源码层面,有很多地方与ArrayBlockingQueue原理类似。前面写过一篇ArrayBlockingQueue源码解析, 看这篇文章之前,可以先看下。 LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(); Thread t0 = new T
2021-01-02 20:31:49
585
原创 双指针解决发饼干问题(leetcode455)
今天是圣诞节,正好遇到的一个发糖果的题目,也算是应景(leetcode455)。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 示例 1:输入: g = [1,2,3], s
2020-12-25 20:21:32
195
原创 动态规划,小试牛刀——使用最小花费爬楼梯(leetcode 746)
数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始)。每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。示例 1:输入: cost = [10, 15, 20]输出: 15解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。示例 2:输入: cost = [1, 100, .
2020-12-21 21:13:14
252
原创 彻底弄懂ArrayBlockingQueue —— 超详细的原码分析
ArrayBlockingQueue 是常见的有界阻塞队列,用过线程池的,对它肯定不陌生。它的实现原理,相信多数人也能说出个大概。可具体实现细节,估计会难住多数人。我在网上查了一圈,大多是讲ArrayBlockingQueue怎么用的。它是怎么阻塞的,却少有人提及。这里,由浅入深,我来剖析下ArrayBlockingQueue的源码,说说它到底是怎么阻塞的。很可能,这是你能看到的,最详细的源码解析,不信的话,耐心看完,再和网上的比较下。当然本人水平有限,若有论述不当之处,请大神指正。ArrayB
2020-12-19 23:44:31
2721
7
原创 ReentrantLock 源码解析(四)—— 解锁源码分析
ReentrantLock 解锁源码分析release方法 tryRelease 方法
2020-12-06 12:29:14
276
原创 ReentrantLock 源码解析(三)—— 加锁源码分析
ReentrantLock 加锁的源码剖析 acquire(int arg) tryAcquire(arg) addWaiter() acquireQueued()
2020-12-06 11:51:09
296
原创 写的让人伤心的翻转对(leetcode493)
给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。示例 1:输入: [1,3,2,3,1]输出: 2示例 2:输入: [2,4,3,5,1]输出: 3注意:给定数组的长度不会超过50000。输入数组中的所有数字都在32位整数的表示范围内。看到这个题目,我没想到什么好的方法,老老实实的暴力破解吧初级版public int reverseP
2020-11-28 21:52:03
197
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人