- 博客(157)
- 资源 (1)
- 收藏
- 关注
原创 Java调试大法,来了~
很多同学经常问我:彤哥,你的源码为什么讲的那么好那么细,有没有什么方法?此时,我一般回复四个字:调试大法。然后,他们就会很懵逼:调试我也会呀,但是,我就做不到你那么细(像是在夸我),难道调试还有我不知道的技巧?我:是的,调试也是有技巧的。同学:那你能分享一下么?我:可以是可以,不过,调试更注重的是实战,像一般的调试方法你百度一下就知道了,但是,知道是一回事,会用是另一回事,就更不用说用得好用得妙了。同学:那怎么才能用得好用得妙呢?我:还是在于平时多思考多运用调试方法去解决各种问题,比如看源码、
2021-06-17 07:48:00
420
原创 mysql批量执行慢请打开参数:rewriteBatchedStatements=true
数据库链接添加参数:rewriteBatchedStatements=true
2021-01-19 15:03:59
878
原创 另类的打印请求参数返回值的方法
在springboot中把以下两个类的日志级别改成debug即可:logging: level: root: info org.springframework.web.servlet.DispatcherServlet: debug org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor: debug效果如下:# 请求进入,打印请求路径及参数202
2020-10-20 15:00:46
590
原创 从红黑树的本质出发,彻底理解红黑树!
前言最近做了公主号迁移,增加了留言功能,欢迎大家聊起来,星标置顶哦。早上好,我是彤哥。上一节,我们一起从二叉树、二叉查找树、平衡树、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
569
1
原创 记一次生产事故:30万单就这样没了!
背景你好,我是彤哥。昨天晚上下班回家,在地铁上,老大突然打来电话,B系统生产环境响应缓慢,影响了A系统的使用,几万小哥收不了单,大概有30万单卡住了,你去帮忙定位一下。我8点半左右到家,立马上线入会。重启我入会的时候,已经有同事在帮忙定位了,俗话说的好,重启能解决80%的问题,如果重启解决不了,那肯定是重启的次数还不够,呸,不对,重启解决不了,就真的要去定位了。事实证明,重启后走一波压测依然没什么用,1000个并发,平均响应时间在3~4秒,连续压了几次都是这样的结果。升级配置重启看来是无效了
2020-09-24 11:59:21
367
1
原创 了解红黑树的起源,理解红黑树的本质
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥。前面两节,我们一起学习了关于跳表的理论知识,并手写了两种完全不同的实现,我们放一张图来简单地回顾一下:实现跳表的关键之处是在有序链表的基础上加上各层索引,通过这些索引可以做到O(log n)的时间复杂度快速地插入、删除、查找元素。说起跳表,我们就不得不提另一种非常经典的数据结构——红黑树,红黑树相对于跳表来说,虽然时间复杂度都是O(log n),但是红黑树的使用场景相对更广泛一些,在早
2020-09-17 22:08:28
442
1
原创 太刺激了,面试官让我手写跳表,而我用两种实现方式吊打了TA!
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥。上一节,我们一起学习了关于跳表的理论知识,相信通过上一节的学习,你一定可以给面试官完完整整地讲清楚跳表的来龙去脉,甚至能够边讲边画图。然而,面试官说,既然你这么精通跳表,不如实现一个呗^^我,我,实现就实现,谁怕谁,哼~~本节,我将通过两种方式手写跳表,并结合画图,彻底搞定跳表实现的细节。第一种方式为跳表的通用实现,第二种方式为彤哥自己发明的实现,并运用到HashMap的改写中。
2020-09-08 06:52:45
402
原创 谁说有序链表不能进行二分查找,只是需要进化而已?!
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥。上一节,我们一起学习了关于哈希的一切,特别是哈希表的进化过程,相信通过上一节的学习,你一定可以从头到尾完整地给面试官讲讲哈希表是如何发展到如今这一步的。但是,难道HashMap的终极形态只能通过“数组+链表+红黑树”的形式实现吗?有没有可替代方案?为什么Java没有使用你说的这种替代方案呢?本节,我们就来学习另外一种数据结构——跳表,关于跳表的内容,我将分成两节完成,第一节介绍跳表的演进
2020-09-06 22:34:21
1556
原创 关于哈希的一切,都在这里了!
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥。上一节,我们一起学习了,在Java中如何构建高性能队列,里面牵涉到很多底层的知识,不知道你有Get到多少呢?!本节,我想跟着大家一起重新学习下关于哈希的一切——哈希、哈希函数、哈希表。这三者有什么样的爱恨情仇?为什么Object类中需要有一个hashCode()方法?它跟equals()方法有什么关系?如何编写一个高性能的哈希表?Java中的HashMap中的红黑树可以使用其它数据
2020-09-03 06:21:34
254
原创 构建高性能队列,你不得不知道的底层知识!
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥。上一节,我们一起学习了如何将递归改写为非递归,其中,用到的数据结构主要是栈。栈和队列,可以说是除了数组和链表之外最基础的数据结构了,在很多场景中都有用到,后面我们也会陆陆续续的看到。今天,我想介绍一下,在Java中,如何构建一个高性能的队列,以及我们需要掌握的底层知识。学习其他语言的同学,也可以看看,在你的语言中,是如何构建高性能队列的。队列队列,是一种先进先出(First In
2020-08-15 00:35:58
327
1
原创 最新情报:所有的递归都可以改写成非递归?
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。上一节,我们使用位图介绍了12306抢票算法的实现,没有收到推送的同学可以点击上方专辑查看,或者在公主号历史消息中查看。在上一节的最后,彤哥收到最新情报,说是所有的递归都可以改写成非递归,是不是真的呢?如何实现呢?有没有套路呢?让我们带着这些问题进入今天的学习吧。何为递归?所谓递归,是指程序在运行的过程中调用自身的行为。这种行为也不能无.
2020-08-12 23:08:58
3507
1
原创 全网首发:12306抢票算法大曝光?(十张图搞定)
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。相信大家都有过抢票、刷票的经验,每年年底,这都是一场盛宴。然而,你有没有想过12306的抢票算法是怎么实现的呢?没有吧,想过,还是没有头绪?今天,我们就来曝光让人又爱又恨的12306是如何实现抢票的。位运算回顾我们知道计算机只能识别0和1,要操作这些0和1,只能通过位运算来进行,那么,一共有几种位运算呢?让我们来回顾一下:运算.
2020-08-07 10:31:41
3805
原创 重温四大基础数据结构:数组、链表、队列和栈
前言本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。数组、链表、队列、栈,是数据结构中最基础的四大结构,数组和链表更是基础中的基础,后续所有复杂的数据结构都是在它们的基础上演变而来的。本节,我们就来重温这四大结构。数组关于数组,大家都比较熟悉了。它是一种线性数据结构,使用一组连续的内存空间存储一组具有相同类型的数据。这个概念中有三个关键词:线性、连续、相同类型。线性,表示没有分叉,任.
2020-08-05 08:14:42
1744
原创 到底什么才是真正的空间复杂度?
前言本篇文章收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。上一节,我们一起学习了复杂度分析的套路和常见的复杂度。但是,我们的案例基本都是以时间复杂度为主,很少接触到空间复杂度。那么,到底什么才是真正的空间复杂度呢?在空间与时间发生冲突时又该如何权衡呢?本节,我们就来解决这两个问题。来个例子现在有一个算法是这样的,给定一个数组,将数组中每个元素都乘以2返回,我实现了下面两种形式:priva.
2020-07-26 21:50:04
571
原创 复杂度分析的套路及常见的复杂度
前言本篇文章收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。上一节,我们一起学习了表示复杂度的几个符号,我们说,通常使用大O来表示算法的复杂度,不仅合理,而且书写方便。那么,使用大O表示法评估算法的复杂度有没有什么套路呢?以及常见的复杂度有哪些呢?本节,我们就来解决这两个问题。前情回顾在正式讲解套路之前,我们先回忆一下前面几节讲到的内容。在第2节,我们学习了渐近分析法,将算法的复杂度与输入规.
2020-07-25 12:10:07
604
原创 O、Θ、Ω、o、ω,别再傻傻分不清了!
前言本篇文章收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。前面几节,我们一起学习了算法的复杂度如何分析,并从最坏、平均、最好以及不能使用最坏情况全方位无死角的剖析了算法的复杂度,在我们表示复杂度的时候,通常使用大O来表示。但是,在其他书籍中,你可能还见过Θ、Ω、o、ω等符号。那么,这些符号又是什么意思呢?本节,我们就来解决这个问题。读音我们先来纠正一波读音:O,/əʊ/,大Oho,/.
2020-07-23 23:09:32
2360
原创 什么情况下不能使用最坏情况评估算法的复杂度?
前言你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。上一节,我们从最坏、平均、最好三种情况分析了算法的复杂度,得出结论,通常来说,使用最坏情况来评估算法的复杂度完全够用了。但是,有些算法是不能使用最坏情况来评估算法的复杂度的。那么,有哪些算法呢?本节,我们将从动态数组以及快速排序这两个个例入手来分析不能使用最坏情况评估复杂度的情形。动态数组动态数组,对应于Java中的ArrayList,在插入元素时,分成两种情况:数组未满,元素放在size下标的位置即可;数组满了,需要扩容.
2020-07-23 07:43:55
684
1
原创 如何从最坏、平均、最好的情况分析复杂度?
前言你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。上一节,我们从事后统计法过渡到渐近分析法,详细讲解了如何进行算法的复杂度分析。但是,如果遵循严格的渐近分析法,需要掌握大量数学知识,这无疑给我们评估算法的优劣带来了很大的挑战。那么,有没有更好地评估算法的方法呢?答案是必然的,本节,我们就从最坏、平均、最好三种情况来分析分析复杂度。案例为了便于讲解,我写了一个小例子:public class LinearSearch { public static void main(.
2020-07-22 06:35:47
1163
原创 如何进行算法的复杂度分析?
前言本篇文章收录于专辑:http://dwz.win/HjK你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。大家都知道,数据结构与算法解决的主要问题就是“快”和“省”的问题,即如何让代码运行得更快, 如何让代码更节省存储空间。所以,“快”和“省”是衡量一个算法非常重要的两项指标,也就是我们经常听到的时间复杂度和空间复杂度分析。那么,为什么需要复杂度分析呢?复杂度分析的方法论是什么呢?这就是我们本节要解决的问题。好了,进入今天的学习吧。为什么需要复杂度分析?首先,我们来思考.
2020-07-21 07:09:44
1506
原创 拿下Netty这座城,从现在开始!
你好,我是彤哥,技术公号主“彤哥读源码”的运营者。其实,我刚学习Netty的时候,也是很迷茫的,直到有一天,一个同事收到了阿里的offer,他要去阿里做中台了,临走前他偷偷地告诉我,多看看Netty,特别是源码。之后,我把市面上有关Netty的书籍和博客几乎全部看了一遍,并跟着书中的示例边看边练,但是,最后,我发现,在Netty的知识方面,我只是从一个学徒变成了一个熟练工,对Netty的理解还是谈不上有多深刻,因为很多书籍或者博客对Netty的讲解都停留在使用的角度,对于核心知识和底层原理,讲解得很少,
2020-07-20 20:33:25
573
原创 当Tomcat遇上Netty
故事背景嘀嘀嘀~,生产事故,内存泄漏!昨天下午,突然收到运维的消息,分部某系统生产环境内存泄漏了,帮忙排查一下。排查过程第一步,要日志分部给到的异常日志大概是这样(鉴于公司规定禁止截图禁止拍照禁止外传任何信息,下面是我网上找到一张类似的报错):LEAK: ByteBuf.release() was not called before it's garbage-collected. See http://netty.io/wiki/reference-counted-objects.html fo
2020-05-19 11:45:13
2566
3
原创 分布式系统中如何优雅地追踪日志(原理篇)
本文只讲原理,不讲框架。分布式系统中日志追踪需要考虑的几个点?需要一个全服务唯一的id,即traceId,如何保证?traceId如何在服务间传递?traceId如何在服务内部传递?traceId如何在多线程中传递?我们一一来解答:全服务唯一的traceId,可以使用uuid生成,正常来说不会出现重复的;关于服务间传递,对于调用者,在协议头加上traceId,...
2020-01-01 14:10:52
1503
原创 哈希情史知多少
——日拱一卒,不期而至!简介hash是我们工作中经常听到的词,比如哈希表、哈希函数、hashCode、HashTable、HashMap等等,那么它们之间到底有怎样的爱恨情仇呢?来一起看一看吧~~数组讲哈希表之前,我们先来看看数据结构的鼻祖——数组。数组比较简单,我就不多说了,大家都会都懂,见下图。数组的下标一般从0开始,依次往后存储元素,查找元素也是一样,只能从头(或从尾)依次查...
2019-12-13 21:11:47
994
原创 7. 彤哥说netty系列之Java NIO核心组件之Selector
——日拱一卒,不期而至!你好,我是彤哥,本篇是netty系列的第七篇。简介上一章我们一起学习了Java NIO的核心组件Buffer,它通常跟Channel一起使用,但是它们在网络IO中又该如何使用呢,今天我们将一起学习另一个NIO核心组件——Selector,没有它可以说就干不起来网络IO。概念我们先来看两段Selector的注释,见类java.nio.channels.Select...
2019-12-05 23:49:09
700
原创 每日一题:面向对象的特征有哪些?
问题:面向对象的特征有哪些?答:封装,继承,多态和抽象。1. 封装 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在 Java 当中,有 3 种修饰符:public,private 和 protected。每一 种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。下面列出了使用封装的一些好处:通过隐藏对象的属性来保护对象内...
2019-12-04 23:34:50
971
原创 6. 彤哥说netty系列之Java NIO核心组件之Buffer
——日拱一卒,不期而至!你好,我是彤哥,本篇是netty系列的第六篇。简介上一章我们一起学习了Java NIO的核心组件Channel,它可以看作是实体与实体之间的连接,而且需要与Buffer交互,这一章我们就来学习一下Buffer的特性。概念Buffer用于与Channel交互时使用,通过上一章的学习我们知道,数据从Channel读取到Buffer,或者从Buffer写入Channe...
2019-12-03 22:39:02
931
原创 5. 彤哥说netty系列之Java NIO核心组件之Channel
你好,我是彤哥,本篇是netty系列的第五篇。简介上一章我们一起学习了如何使用Java原生NIO实现群聊系统,这章我们一起来看看Java NIO的核心组件之一——Channel。思维转变首先,我想说的最重要的一个点是,学习NIO思维一定要从BIO那种一个连接一个线程的模式转变成多个连接(Channel)共用一个线程来处理的这种思维。1个Connection = 1个Socket ...
2019-12-01 23:44:04
1115
原创 关于JDK源码:我想聊聊如何更高效地阅读
简介大家好,我是彤哥,今天我想和大家再聊聊JDK源码的几个问题:为什么要看JDK源码JDK源码的阅读顺序JDK源码的阅读方法为什么要看JDK源码一,JDK源码是其它所有源码的基础,看懂了JDK源码再看其它的源码会达到事半功倍的效果。二,JDK源码中包含大量的数据结构知识,是学习数据结构很好的资料,比如,链表、队列、散列表、红黑树、跳表、桶、堆、双端队列等。三、JDK源码中包...
2019-11-29 00:22:56
565
3
原创 4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了)
你好,我是彤哥,本篇是netty系列的第四篇。欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。简介上一章我们一起学习了Java中的BIO/NIO/AIO的故事,本章将带着大家一起使用纯纯的NIO实现一个越聊越上瘾的“群聊系统”。业务逻辑分析首先,我们先来分析一下群聊的功能点:(1)加入群聊,并通知其他人;(2)发言,并通知其他人;(3)退出群聊,并通知其他人;一个简单的群...
2019-11-20 00:03:20
1158
原创 3. 彤哥说netty系列之Java BIO NIO AIO进化史
你好,我是彤哥,本篇是netty系列的第三篇。欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。简介上一章我们介绍了IO的五种模型,实际上Java只支持其中的三种,即BIO/NIO/AIO。本文将介绍Java中这三种IO的进化史,并从使用的角度剖析它们背后的故事。Java BIOBIO概念解析BIO,Blocking IO,阻塞IO,它是Java的上古产品,自出生就有的东西(...
2019-11-19 07:35:43
1001
1
原创 2. 彤哥说netty系列之IO的五种模型
你好,我是彤哥,本篇是netty系列的第二篇。欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。简介本文将介绍linux中的五种IO模型,同时也会介绍阻塞/非阻塞与同步/异步的区别。何为IO模型对于一次IO操作,数据会先拷贝到内核空间中,然后再从内核空间拷贝到用户空间中,所以一次read操作,会经历两个阶段:(1)等待数据准备(2)数据从内核空间拷贝到用户空间基于以上两个阶段...
2019-11-14 00:04:09
982
原创 1. 彤哥说netty系列之开篇(有个问卷调查)
你好,我是彤哥,本篇是netty系列的第一篇。欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。简介本文主要讲述netty系列的整体规划,并调查一下大家喜欢的学习方式。知识点netty系列彤哥准备分成三个大的模块来完成:入门篇入门篇主要讲述一些必备的基础知识,例如IO的五种模型、BIO/NIO/AIO如何演进、Java nio的使用及组件介绍、netty的使用及组件介...
2019-11-12 22:34:05
1127
1
原创 死磕 java线程系列之终篇
(手机横屏看源码更方便)简介线程系列我们基本就学完了,这一个系列我们基本都是围绕着线程池在讲,其实关于线程还有很多东西可以讲,后面有机会我们再补充进来。当然,如果你有什么好的想法,也可以公从号右下角联系我。重要知识点直接上图,看着这张图我相信你能够回忆起很多东西,也可以看着这张图来自己提问自己回答,当然,也可以把这张图作为面试复习的参考。其中,ThreadLocal是我们没有分析...
2019-11-11 00:07:29
1047
3
原创 死磕 java线程系列之ForkJoinPool深入解析
(手机横屏看源码更方便)注:java源码分析部分如无特殊说明均基于 java8 版本。注:本文基于ForkJoinPool分治线程池类。简介随着在硬件上多核处理器的发展和广泛使用,并发编程成为程序员必须掌握的一门技术,在面试中也经常考查面试者并发相关的知识。今天,我们就来看一道面试题:如何充分利用多核CPU,计算很大数组中所有整数的和?剖析单线程相加?我们最容易想到...
2019-11-09 01:09:56
1483
原创 死磕 java线程系列之线程池深入解析——定时任务执行流程
(手机横屏看源码更方便)注:java源码分析部分如无特殊说明均基于 java8 版本。注:本文基于ScheduledThreadPoolExecutor定时线程池类。简介前面我们一起学习了普通任务、未来任务的执行流程,今天我们再来学习一种新的任务——定时任务。定时任务是我们经常会用到的一种任务,它表示在未来某个时刻执行,或者未来按照某种规则重复执行的任务。问题(1)如何保证任务是...
2019-11-05 21:28:11
1067
原创 死磕 java线程系列之线程池深入解析——未来任务执行流程
(手机横屏看源码更方便)注:java源码分析部分如无特殊说明均基于 java8 版本。注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类。简介前面我们一起学习了线程池中普通任务的执行流程,但其实线程池中还有一种任务,叫作未来任务(future task),使用它您可以获取任务执行的结果,它是怎么实现的呢?建议学习本章前先去看看彤哥之前写的《死磕 java线程系列...
2019-11-04 21:53:29
1010
原创 死磕 java线程系列之线程池深入解析——普通任务执行流程
(手机横屏看源码更方便)注:java源码分析部分如无特殊说明均基于 java8 版本。注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类。简介前面我们一起学习了Java中线程池的体系结构、构造方法和生命周期,本章我们一起来学习线程池中普通任务到底是怎么执行的。建议学习本章前先去看看彤哥之前写的《死磕 java线程系列之自己动手写一个线程池》那两章,有助于理解本章...
2019-11-03 15:33:04
481
原创 面试 LockSupport.park()会释放锁资源吗?
(手机横屏看源码更方便)引子大家知道,我最近在招人,今天遇到个同学,他的源码看过一些,然后我就开始了AQS连环问。我:说说AQS的大致流程?他:AQS包含一个状态变量,一个同步队列……balabala……互斥锁balabala,共享锁balabala……我:AQS中除了同步队列,还有什么队列?他:还有个Condition,Condition中有个条件队列……我:条件队列和同步队...
2019-10-31 00:04:13
5003
10
原创 死磕 java线程系列之线程池深入解析——生命周期
(手机横屏看源码更方便)注:java源码分析部分如无特殊说明均基于 java8 版本。注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类。简介上一章我们一起重温了下线程的生命周期(六种状态还记得不?),但是你知不知道其实线程池也是有生命周期的呢?!问题(1)线程池的状态有哪些?(2)各种状态下对于任务队列中的任务有何影响?先上源码其实,在我们讲线程池体系...
2019-10-27 20:25:54
1073
原创 k8s问题整理:安装helm踩坑
提示找不到请求的资源Error: error installing: the server could not find the requested resource原因是k8s高版本加入了service account的概念,这里可以通过下面的方式配置service account,再init即可成功:kubectl create serviceaccount --namespace...
2019-10-21 15:33:09
723
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人