自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入理解线程池(ThreadPoolExecutor)——细致入微的讲源码。

本文解析线程池的源码,同时会详细说明以下这些问题。1、线程池状态是怎么控制的2、创建线程是怎么防止并发的3、核心线程数和最大线程数,具体干啥的4、哪些地方用了 AQS 框架5、线程最长存活时间,是怎样控制线程生命周期的6、addWorker 时,传一个空任务,是干嘛的

2021-02-13 17:19:39 934 7

原创 彻底弄懂ReentrantLock —— 超详细的原码分析

java1.6 之前, synchronized效率很低,AQS框架就是解决并发问题的首选。我们从 ReentrantLock入手,看下AQS怎么解决并发问题的。如下代码,存在多线程并发问题// TODO用 ReentrantLock 加锁,来看下效果,这里我们用公平锁ReentrantLock lock = new ReentrantLock(true); lock.lock();...

2020-10-07 00:15:33 1862 14

原创 ReentrantReadWriteLock到底怎么玩儿?

本文写了ReentrantReadWriteLock 基本使用方法,从源码层面讲解了,读锁逻辑,写锁逻辑,读锁计数等等。

2023-04-02 17:11:56 447 1

原创 CompletableFuture 源码分析 thenCombine & thenCompose

CompletableFuture 源码分析,1、supplyAsync 提交任务到线程池, 2、thenCombine 全并两个异步任务,3、thenCompose 更复杂的合并两个任务

2023-03-25 20:14:39 725

原创 CompletableFuture 的 allOf 方法底层原理是什么

CompletableFuture 底层原理,通过 allOf / anyOf 两个方法,详细分析源码

2023-03-20 01:51:48 1902 10

原创 Mysql相关知识点汇总

Mysql 相关知识点:InnoDB,,MVCC,WAL,间隙锁,两阶段提交等

2022-10-15 16:56:41 549

原创 如何用 BitSet 求解质数问题

BitSet 的应用。在 ArrayList 的源码中,巧用BitSet 实现数组原地复制

2022-07-28 21:16:34 274

原创 BitSet源码解析,位运算玩的真六

BitSet 也就是位图,底层用 long 数组,用 位 来存储数据。本文介绍 BItSet 常用的方法,及源码解析

2022-07-20 23:20:41 1690 2

原创 JAVA Virtual Machine

JAVA 虚拟机的内存模型,摘抄官网内容,简单翻译总结

2022-07-17 23:05:41 358

原创 双亲委派——就是个唬人的翻译

双亲委派的机制是什么,为什么这么设计,如何打破双亲委派

2022-06-24 10:40:33 373

原创 BUG探究 ConCurrentHashMap 源码中的 bug

ConCurrentHashMap 源码的 bug 分析,为什么源码错了,也能正常使用!

2022-03-17 23:58:11 1022

原创 CountDownLatch 是干啥的,到底难不难?

CountDownLatch 使用示例、原理说明与源码解读

2022-01-08 21:13:18 561 6

原创 ThreadLocal 怎么就内存溢出了,看源码究竟是怎么写的。

ThreadLocal 源码解析、内存溢出问题探究、ThreadLocal 方法的使用

2021-12-27 00:08:11 662

原创 semaphore源码解析:信号量到底是个啥?

semaphore 的源码解析。请求许可、释放许可

2021-12-19 20:22:27 683 2

原创 线程池提交任务 execute 和 submit,到底选哪个?

关于线程池,写过两篇文章《线程池基本原理详解》、《定时类线程池工作原理》。这两篇文章,从源码的角度,分析的很详细,文章也很长。这一篇,介绍一个很小的点,使用线程池时,任务提交的方法,execute 和 submit 这两个到底怎么选?一、示例代码先说 Runnable任务,可以这么写 Runnable runnable = new Runnable() { @Override public void run() { System.o

2021-08-22 12:32:12 1175 1

原创 ScheduledThreadPool 源码解析——定时类线程池是如何工作的

延时类的线程池,是如何工作的?scheduleAtFixedRate、scheduleWithFixedDelay 有什么区别,如何实现。

2021-04-03 23:23:04 1172

原创 ConCurrentHashMap并发环境时,如何计数的?—— sumCount()、fullAddCount()

ConCurrentHashMap 在并发环境下的计数问题。主要有两个手段。针对源码,本文进行详细的说明

2021-03-22 19:30:12 1355 4

原创 ConCurrentHashMap并发环境下,如何扩容?

ConCurrentHashMap 扩容的源码分析。 sizeCtl 参数的具体应用

2021-03-17 22:30:32 609 2

原创 ConCurrentHashMap源码解析——高并发时,触发扩容:addCount() 方法

ConCurrentHashMap 会自动扩容,而且可能多个线程参与扩容。本篇主要讲下,触发扩容的源码。

2021-03-14 09:50:22 906 3

原创 图解 ConCurrentHashMap ——从源码层面,弄清楚它是怎么控制并发的

ConCurrentHashMap的基本原理,从 插入元素、扩容等等方面,弄明白它是怎么控件并发的。

2021-03-10 23:20:22 1197 16

原创 图解 HashMap 源码——逐行分析源码,面试再也不怕被问HashMap了

HasmMap 的底层原理,讲解源码中的 put、 remove、get方法。

2021-02-27 20:55:00 338

原创 HashMap 与 ConCurrentHashMap简单原理

HashMap 和ConcurrentHashMap 的简化版的实现原理。 解析源码前先理解它俩共同的玩法。

2021-02-24 22:33:23 332 2

原创 浅谈阻塞队列 BlockingQueue

关于阻塞队列,具体写过几篇源码剖析的文章。常用的这几个阻塞队列,都逐一解析了一遍。本篇做一个总括的介绍。.

2021-02-17 10:06:16 241 2

原创 图解DelayQueue源码(java 8)——延时队列的小九九

DelayQueue 源码解析,用画图的方式,讲明白延时队列的工作原理。

2021-02-16 11:21:34 774

原创 线程池源码解析——四种拒绝策略

ThreadPoolExecutor 类中,线程池的四种拒绝策略。 本文摘录出源码,逐一分析

2021-02-15 09:41:49 480 5

原创 图解线程池——清新脱俗的讲原理

用画图的方式,讲明白线程池的运行逻辑。

2021-02-10 17:36:29 849 1

原创 SynchronousQueue源码解析(非公平模式)

上篇文章,介绍了 SynchronousQueue 的公平模式(源码分析)。这篇文章,从源码入手,解析 非公平模式。如果你对SynchronousQueue不熟悉,可以先看我的这篇文章(图解SynchronousQueue)。一、初始化 SynchronousQueue<Integer> queue = new SynchronousQueue<>(); public SynchronousQueue() { this(false); }

2021-01-12 22:56:24 333

原创 SynchronousQueue源码解析(公平模式)

上篇文章中,画图解释了,SynchronousQueue 的工作原理。这篇文章,详细的解析源码(图解 SynchronousQueue原理)。默认你已经读了上篇文章,这篇文章重点说源码。以公平模式为例一、初始化 SynchronousQueue<Integer> queue = new SynchronousQueue<>(true); public SynchronousQueue(boolean fair) { transferer = fair

2021-01-10 18:01:35 639 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 1417 7

原创 图解PriorityBlockingQueue源码(java 8)

PriorityBlockingQueue 是一个带有优先级的阻塞队列。基本原理和前面介绍的ArrayBlockingQueue类似。在看这篇文章之前,你可以先仔细看下这篇文章——ArrayBlockingQueue源码解析PriorityBlockingQueue和ArrayBlockingQueue一样,初始化时,可指定队列的大小。不同的是,前者可以自动扩容,而后者不会。另一个很大不同是,前者可以实现优先出队,后者则是先进先出。比如有这么一个场景,一个市场上陆陆续续来了很多卖苹果的。这时来

2021-01-04 20:58:35 374

原创 图解LinkedBlockingQueue源码(java 8)

LinkedBlockingQueue是一个阻塞队列,采用双锁技术,性能较 ArrayBlockingQueue有很大的提高。源码层面,有很多地方与ArrayBlockingQueue原理类似。前面写过一篇ArrayBlockingQueue源码解析, 看这篇文章之前,可以先看下。 LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(); Thread t0 = new T

2021-01-02 20:31:49 482

原创 双指针解决发饼干问题(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 147

原创 动态规划,小试牛刀——使用最小花费爬楼梯(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 223

原创 彻底弄懂ArrayBlockingQueue —— 超详细的原码分析

ArrayBlockingQueue 是常见的有界阻塞队列,用过线程池的,对它肯定不陌生。它的实现原理,相信多数人也能说出个大概。可具体实现细节,估计会难住多数人。我在网上查了一圈,大多是讲ArrayBlockingQueue怎么用的。它是怎么阻塞的,却少有人提及。这里,由浅入深,我来剖析下ArrayBlockingQueue的源码,说说它到底是怎么阻塞的。很可能,这是你能看到的,最详细的源码解析,不信的话,耐心看完,再和网上的比较下。当然本人水平有限,若有论述不当之处,请大神指正。ArrayB

2020-12-19 23:44:31 1806 7

原创 ReentrantLock 源码解析(五)—— 公平锁与非公平锁的源码对比

ReentrantLock 公平锁与非公平锁,区别其实很小

2020-12-06 12:43:55 211

原创 ReentrantLock 源码解析(四)—— 解锁源码分析

ReentrantLock 解锁源码分析release方法 tryRelease 方法

2020-12-06 12:29:14 240

原创 ReentrantLock 源码解析(三)—— 加锁源码分析

ReentrantLock 加锁的源码剖析 acquire(int arg) tryAcquire(arg) addWaiter() acquireQueued()

2020-12-06 11:51:09 251

原创 ReentrantLock 源码解析(二)—— 加锁解锁方法概览

ReentrantLock 加锁解锁的基本方法逻辑

2020-12-06 11:34:16 336

原创 ReentrantLock 源码解析(一)—— AQS到底是什么

AQS 简单介绍, state, head, tail, node 属性

2020-12-06 10:55:42 240

原创 写的让人伤心的翻转对(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 154

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除