彤哥读源码
分享Java源码系列文章,包括但不限于java集合源码、java并发包源码、spring全家桶源码、mybatis源码、dubbo源码、zookeeper源码、rocketmq源码等。
tangtong1
这个作者很懒,什么都没留下…
展开
-
Java调试大法,来了~
很多同学经常问我:彤哥,你的源码为什么讲的那么好那么细,有没有什么方法?此时,我一般回复四个字:调试大法。然后,他们就会很懵逼:调试我也会呀,但是,我就做不到你那么细(像是在夸我),难道调试还有我不知道的技巧?我:是的,调试也是有技巧的。同学:那你能分享一下么?我:可以是可以,不过,调试更注重的是实战,像一般的调试方法你百度一下就知道了,但是,知道是一回事,会用是另一回事,就更不用说用得好用得妙了。同学:那怎么才能用得好用得妙呢?我:还是在于平时多思考多运用调试方法去解决各种问题,比如看源码、原创 2021-06-17 07:48:00 · 396 阅读 · 0 评论 -
从红黑树的本质出发,彻底理解红黑树!
前言最近做了公主号迁移,增加了留言功能,欢迎大家聊起来,星标置顶哦。早上好,我是彤哥。上一节,我们一起从二叉树、二叉查找树、平衡树、AVL树、2-3树、2-3-4树、B树,一路讲到红黑树,最后得出红黑树的本质:红黑树就是2-3-4树,请看下图:我们知道2-3-4的插入、删除、查找元素的原理是相当简单的,那么,我们是不是可以利用2-3-4树来记忆红黑树呢?答案是肯定的,本节,我们就来看看如何利用2-3-4树来快速掌握红黑树,再也不用死记硬背了~~好了,让我们进入今天的学习吧。再忆2-3-4原创 2020-10-12 07:12:34 · 551 阅读 · 1 评论 -
记一次生产事故:30万单就这样没了!
背景你好,我是彤哥。昨天晚上下班回家,在地铁上,老大突然打来电话,B系统生产环境响应缓慢,影响了A系统的使用,几万小哥收不了单,大概有30万单卡住了,你去帮忙定位一下。我8点半左右到家,立马上线入会。重启我入会的时候,已经有同事在帮忙定位了,俗话说的好,重启能解决80%的问题,如果重启解决不了,那肯定是重启的次数还不够,呸,不对,重启解决不了,就真的要去定位了。事实证明,重启后走一波压测依然没什么用,1000个并发,平均响应时间在3~4秒,连续压了几次都是这样的结果。升级配置重启看来是无效了原创 2020-09-24 11:59:21 · 351 阅读 · 1 评论 -
了解红黑树的起源,理解红黑树的本质
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥。前面两节,我们一起学习了关于跳表的理论知识,并手写了两种完全不同的实现,我们放一张图来简单地回顾一下:实现跳表的关键之处是在有序链表的基础上加上各层索引,通过这些索引可以做到O(log n)的时间复杂度快速地插入、删除、查找元素。说起跳表,我们就不得不提另一种非常经典的数据结构——红黑树,红黑树相对于跳表来说,虽然时间复杂度都是O(log n),但是红黑树的使用场景相对更广泛一些,在早原创 2020-09-17 22:08:28 · 421 阅读 · 1 评论 -
太刺激了,面试官让我手写跳表,而我用两种实现方式吊打了TA!
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥。上一节,我们一起学习了关于跳表的理论知识,相信通过上一节的学习,你一定可以给面试官完完整整地讲清楚跳表的来龙去脉,甚至能够边讲边画图。然而,面试官说,既然你这么精通跳表,不如实现一个呗^^我,我,实现就实现,谁怕谁,哼~~本节,我将通过两种方式手写跳表,并结合画图,彻底搞定跳表实现的细节。第一种方式为跳表的通用实现,第二种方式为彤哥自己发明的实现,并运用到HashMap的改写中。原创 2020-09-08 06:52:45 · 382 阅读 · 0 评论 -
谁说有序链表不能进行二分查找,只是需要进化而已?!
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥。上一节,我们一起学习了关于哈希的一切,特别是哈希表的进化过程,相信通过上一节的学习,你一定可以从头到尾完整地给面试官讲讲哈希表是如何发展到如今这一步的。但是,难道HashMap的终极形态只能通过“数组+链表+红黑树”的形式实现吗?有没有可替代方案?为什么Java没有使用你说的这种替代方案呢?本节,我们就来学习另外一种数据结构——跳表,关于跳表的内容,我将分成两节完成,第一节介绍跳表的演进原创 2020-09-06 22:34:21 · 1492 阅读 · 0 评论 -
关于哈希的一切,都在这里了!
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥。上一节,我们一起学习了,在Java中如何构建高性能队列,里面牵涉到很多底层的知识,不知道你有Get到多少呢?!本节,我想跟着大家一起重新学习下关于哈希的一切——哈希、哈希函数、哈希表。这三者有什么样的爱恨情仇?为什么Object类中需要有一个hashCode()方法?它跟equals()方法有什么关系?如何编写一个高性能的哈希表?Java中的HashMap中的红黑树可以使用其它数据原创 2020-09-03 06:21:34 · 242 阅读 · 0 评论 -
死磕 java同步系列之StampedLock源码解析
问题(1)StampedLock是什么?(2)StampedLock具有什么特性?(3)StampedLock是否支持可重入?(4)StampedLock与ReentrantReadWriteLock的对比?简介StampedLock是java8中新增的类,它是一个更加高效的读写锁的实现,而且它不是基于AQS来实现的,它的内部自成一片逻辑,让我们一起来学习吧。StampedLock具...原创 2019-06-24 22:15:11 · 239 阅读 · 0 评论 -
死磕 java同步系列之AQS终篇(面试)
问题(1)AQS的定位?(2)AQS的重要组成部分?(3)AQS运用的设计模式?(4)AQS的总体流程?简介AQS的全称是AbstractQueuedSynchronizer,它的定位是为Java中几乎所有的锁和同步器提供一个基础框架。在之前的章节中,我们一起学习了ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatc...原创 2019-06-23 22:40:54 · 373 阅读 · 0 评论 -
死磕 java同步系列之CountDownLatch源码解析
问题(1)CountDownLatch是什么?(2)CountDownLatch具有哪些特性?(3)CountDownLatch通常运用在什么场景中?(4)CountDownLatch的初始次数是否可以调整?简介CountDownLatch,可以翻译为倒计时器,但是似乎不太准确,它的含义是允许一个或多个线程等待其它线程的操作执行完毕后再执行后续的操作。CountDownLatch的通...原创 2019-06-16 23:35:47 · 235 阅读 · 0 评论 -
死磕 java同步系列之Semaphore源码解析
问题(1)Semaphore是什么?(2)Semaphore具有哪些特性?(3)Semaphore通常使用在什么场景中?(4)Semaphore的许可次数是否可以动态增减?(5)Semaphore如何实现限流?简介Semaphore,信号量,它保存了一系列的许可(permits),每次调用acquire()都将消耗一个许可,每次调用release()都将归还一个许可。特性Sema...原创 2019-06-16 11:06:39 · 204 阅读 · 0 评论 -
死磕 java同步系列之ReentrantReadWriteLock源码解析
问题(1)读写锁是什么?(2)读写锁具有哪些特性?(3)ReentrantReadWriteLock是怎么实现读写锁的?(4)如何使用ReentrantReadWriteLock实现高效安全的TreeMap?简介读写锁是一种特殊的锁,它把对共享资源的访问分为读访问和写访问,多个线程可以同时对共享资源进行读访问,但是同一时间只能有一个线程对共享资源进行写访问,使用读写锁可以极大地提高并发...原创 2019-06-13 21:44:56 · 202 阅读 · 0 评论 -
死磕 java同步系列之ReentrantLock VS synchronized——结果可能跟你想的不一样
问题(1)ReentrantLock有哪些优点?(2)ReentrantLock有哪些缺点?(3)ReentrantLock是否可以完全替代synchronized?简介synchronized是Java原生提供的用于在多线程环境中保证同步的关键字,底层是通过修改对象头中的MarkWord来实现的。ReentrantLock是Java语言层面提供的用于在多线程环境中保证同步的类,底层是...原创 2019-06-11 08:19:19 · 191 阅读 · 0 评论 -
死磕 java同步系列之ReentrantLock源码解析(二)——条件锁
问题(1)条件锁是什么?(2)条件锁适用于什么场景?(3)条件锁的await()是在其它线程signal()的时候唤醒的吗?简介条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。比如,在阻塞队列中,当队列中没有元素的时候是无法弹出一个元素的,这时候就需要阻塞在条件notEmpty上,等待其它线程往里面放入一个元素后,唤醒这个条件...原创 2019-06-03 00:19:26 · 237 阅读 · 0 评论 -
死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
问题(1)重入锁是什么?(2)ReentrantLock如何实现重入锁?(3)ReentrantLock为什么默认是非公平模式?(4)ReentrantLock除了可重入还有哪些特性?简介Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Reentrant翻译为可重复进入的、可再次进...原创 2019-06-02 00:48:40 · 341 阅读 · 0 评论 -
死磕 java同步系列之AQS起篇
问题(1)AQS是什么?(2)AQS的定位?(3)AQS的实现原理?(4)基于AQS实现自己的锁?简介AQS的全称是AbstractQueuedSynchronizer,它的定位是为Java中几乎所有的锁和同步器提供一个基础框架。AQS是基于FIFO的队列实现的,并且内部维护了一个状态变量state,通过原子更新这个状态变量state即可以实现加锁解锁操作。本章及后续章节的内容理解...原创 2019-05-26 21:53:34 · 250 阅读 · 0 评论 -
死磕 java同步系列之自己动手写一个锁Lock
问题(1)自己动手写一个锁需要哪些知识?(2)自己动手写一个锁到底有多简单?(3)自己能不能写出来一个完美的锁?简介本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁、解锁操作。本篇文章的目标二是通过自己动手写一个锁,能更好地理解后面章节将要学习的AQS及各种同步器实现的原理。分析自己动手写一个锁需要准备些什么呢?首先,在上一章学习synchronized的...原创 2019-05-23 22:48:13 · 225 阅读 · 1 评论 -
死磕 java同步系列之synchronized解析
问题(1)synchronized的特性?(2)synchronized的实现原理?(3)synchronized是否可重入?(4)synchronized是否是公平锁?(5)synchronized的优化?(6)synchronized的五种使用方式?简介synchronized关键字是Java里面最基本的同步手段,它经过编译之后,会在同步块的前后分别生成 monitorente...原创 2019-05-21 08:00:29 · 255 阅读 · 0 评论 -
死磕 java同步系列之volatile解析
问题(1)volatile是如何保证可见性的?(2)volatile是如何禁止重排序的?(3)volatile的实现原理?(4)volatile的缺陷?简介volatile可以说是Java虚拟机提供的最轻量级的同步机制了,但是它并不容易被正确地理解,以至于很多人不习惯使用它,遇到多线程问题一律使用synchronized或其它锁来解决。了解volatile的语义对理解多线程的特性具有...原创 2019-05-19 23:19:11 · 287 阅读 · 0 评论 -
死磕 java同步系列之JMM(Java Memory Model)
简介Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。硬件内存模型在正式讲解Java的内存模型之前,我们有必要先了解一下硬件层面的一些东西。在现代计算机的硬件体系中,CPU的运算速度是非常快的,远远高于它从存储介质读取数据的速度,这里的存储介质有很多,比如磁盘、光盘、网卡、内存等,这些存储...原创 2019-05-18 01:45:26 · 230 阅读 · 0 评论 -
死磕 java同步系列之开篇
原创 2019-05-14 21:56:59 · 200 阅读 · 0 评论 -
死磕 java原子类之终结篇(面试题)
概览原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。在java中提供了很多原子类,笔者在此主要把这些原子类分成四大类。原子更新基本类型或引用类型如果是基本类型,则替换其值,如果是引...原创 2019-05-13 23:35:12 · 207 阅读 · 0 评论 -
死磕 java并发包之LongAdder源码分析
问题(1)java8中为什么要新增LongAdder?(2)LongAdder的实现方式?(3)LongAdder与AtomicLong的对比?简介LongAdder是java8中新增的原子类,在多线程环境中,它比AtomicLong性能要高出不少,特别是写多的场景。它是怎么实现的呢?让我们一起来学习吧。原理LongAdder的原理是,在最初无竞争时,只更新base的值,当有多线程...原创 2019-05-13 00:04:50 · 207 阅读 · 1 评论 -
死磕 java并发包之AtomicStampedReference源码分析(ABA问题详解)
问题(1)什么是ABA?(2)ABA的危害?(3)ABA的解决方法?(4)AtomicStampedReference是什么?(5)AtomicStampedReference是怎么解决ABA的?简介AtomicStampedReference是java并发包下提供的一个原子类,它能解决其它原子类无法解决的ABA问题。ABAABA问题发生在多线程环境中,当某线程连续读取同一块内存...原创 2019-05-09 21:33:17 · 282 阅读 · 0 评论 -
死磕 java并发包之AtomicInteger源码分析
问题(1)什么是原子操作?(2)原子操作和数据库的ACID有啥关系?(3)AtomicInteger是怎么实现原子操作的?(4)AtomicInteger是有什么缺点?简介AtomicInteger是java并发包下面提供的原子类,主要操作的是int类型的整型,通过调用底层Unsafe的CAS等方法实现原子操作。还记得Unsafe吗?点击链接直达【死磕 java魔法类之Unsafe解...原创 2019-05-07 00:21:23 · 215 阅读 · 0 评论 -
死磕 java魔法类之Unsafe解析
问题(1)Unsafe是什么?(2)Unsafe只有CAS的功能吗?(3)Unsafe为什么是不安全的?(4)怎么使用Unsafe?简介本章是java并发包专题的第一章,但是第一篇写的却不是java并发包中类,而是java中的魔法类sun.misc.Unsafe。Unsafe为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用。但是,为了更好地了解j...原创 2019-05-06 01:01:25 · 257 阅读 · 0 评论 -
死磕 java集合之终结篇
概览我们先来看一看java中所有集合的类关系图。这里面的类太多了,请放大看,如果放大还看不清,请再放大看,如果还是看不清,请放弃。我们下面主要分成五个部分来逐个击破。ListList中的元素是有序的、可重复的,主要实现方式有动态数组和链表。java中提供的List的实现主要有ArrayList、LinkedList、CopyOnWriteArrayList,另外还有两个古老的类Ve...原创 2019-05-04 22:00:14 · 1825 阅读 · 7 评论 -
死磕 java集合之LinkedList源码分析
问题(1)LinkedList只是一个List吗?(2)LinkedList还有其它什么特性吗?(3)LinkedList为啥经常拿出来跟ArrayList比较?(4)我为什么把LinkedList放在最后一章来讲?简介LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。继承体系通过继承体系...原创 2019-05-03 09:20:28 · 203 阅读 · 0 评论 -
死磕 java集合之ArrayDeque源码分析
问题(1)什么是双端队列?(2)ArrayDeque是怎么实现双端队列的?(3)ArrayDeque是线程安全的吗?(4)ArrayDeque是有界的吗?简介双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列。ArrayDeque是一种以数组方式实现的双端队列,它是非线程安全的。继承体系通过继承体系可以看,ArrayDeque实现了Deque接口,Deque接口...原创 2019-04-29 23:17:35 · 178 阅读 · 0 评论 -
死磕 java集合之DelayQueue源码分析
问题(1)DelayQueue是阻塞队列吗?(2)DelayQueue的实现方式?(3)DelayQueue主要用于什么场景?简介DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务。继承体系从继承体系可以看到,DelayQueue实现了BlockingQueue,所以它是一个阻塞队列。另外,DelayQueue还组合了一个叫做Delayed的接口,Delay...原创 2019-04-28 23:33:30 · 195 阅读 · 0 评论 -
死磕 java集合之ConcurrentLinkedQueue源码分析
问题(1)ConcurrentLinkedQueue是阻塞队列吗?(2)ConcurrentLinkedQueue如何保证并发安全?(3)ConcurrentLinkedQueue能用于线程池吗?简介ConcurrentLinkedQueue只实现了Queue接口,并没有实现BlockingQueue接口,所以它不是阻塞队列,也不能用于线程池中,但是它是线程安全的,可用于多线程环境中。...原创 2019-04-27 23:40:03 · 143 阅读 · 0 评论 -
死磕 java集合之LinkedTransferQueue源码分析
问题(1)LinkedTransferQueue是什么东东?(2)LinkedTransferQueue是怎么实现阻塞队列的?(3)LinkedTransferQueue是怎么控制并发安全的?(4)LinkedTransferQueue与SynchronousQueue有什么异同?简介LinkedTransferQueue是LinkedBlockingQueue、Synchronous...原创 2019-04-27 18:38:41 · 163 阅读 · 0 评论 -
死磕 java集合之PriorityBlockingQueue源码分析
问题(1)PriorityBlockingQueue的实现方式?(2)PriorityBlockingQueue是否需要扩容?(3)PriorityBlockingQueue是怎么控制并发安全的?简介PriorityBlockingQueue是java并发包下的优先级阻塞队列,它是线程安全的,如果让你来实现你会怎么实现它呢?还记得我们前面介绍过的PriorityQueue吗?点击链接直...原创 2019-04-26 09:04:20 · 185 阅读 · 0 评论 -
死磕 java集合之SynchronousQueue源码分析
原创 2019-04-25 23:02:01 · 191 阅读 · 0 评论 -
死磕 java集合之LinkedBlockingQueue源码分析
原创 2019-04-22 22:21:03 · 184 阅读 · 0 评论 -
死磕 java集合之ArrayBlockingQueue源码分析
问题(1)ArrayBlockingQueue的实现方式?(2)ArrayBlockingQueue是否需要扩容?(3)ArrayBlockingQueue有什么缺点?简介ArrayBlockingQueue是java并发包下一个以数组实现的阻塞队列,它是线程安全的,至于是否需要扩容,请看下面的分析。队列队列,是一种线性表,它的特点是先进先出,又叫FIFO,就像我们平常排队一样,先到...原创 2019-04-21 22:40:38 · 170 阅读 · 0 评论 -
死磕 java集合之PriorityQueue源码分析
问题(1)什么是优先级队列?(2)怎么实现一个优先级队列?(3)PriorityQueue是线程安全的吗?(4)PriorityQueue就有序的吗?简介优先级队列,是0个或多个元素的集合,集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素。一般来说,优先级队列使用堆来实现。还记得堆的相关知识吗?链接直达【拜托,面试别再问我堆(排序)了!】。那么Java里面是如...原创 2019-04-20 22:24:23 · 192 阅读 · 0 评论 -
死磕 java集合之ConcurrentSkipListSet源码分析——Set大汇总
问题(1)ConcurrentSkipListSet的底层是ConcurrentSkipListMap吗?(2)ConcurrentSkipListSet是线程安全的吗?(3)ConcurrentSkipListSet是有序的吗?(4)ConcurrentSkipListSet和之前讲的Set有何不同?简介ConcurrentSkipListSet底层是通过ConcurrentNavi...原创 2019-04-18 21:24:19 · 955 阅读 · 0 评论 -
死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计
问题(1)CopyOnWriteArraySet是用Map实现的吗?(2)CopyOnWriteArraySet是有序的吗?(3)CopyOnWriteArraySet是并发安全的吗?(4)CopyOnWriteArraySet以何种方式保证元素不重复?(5)如何比较两个Set中的元素是否完全一致?简介CopyOnWriteArraySet底层是使用CopyOnWriteArrayL...原创 2019-04-17 22:12:33 · 234 阅读 · 0 评论 -
死磕 java集合之TreeSet源码分析
问题(1)TreeSet真的是使用TreeMap来存储元素的吗?(2)TreeSet是有序的吗?(3)TreeSet和LinkedHashSet有何不同?简介TreeSet底层是采用TreeMap实现的一种Set,所以它是有序的,同样也是非线程安全的。源码分析经过前面我们学习HashSet和LinkedHashSet,基本上已经掌握了Set实现的套路了。所以,也不废话了,直接上源码...原创 2019-04-16 20:55:01 · 227 阅读 · 0 评论