10 2021 档案

摘要:前两节你应该掌握了ReentrantLock加锁成功和加锁失败入队的核心逻辑,是如何通过AQS中的3个组件做到的。今天来我们看下: ReentrantLock中,当线程释放锁时的逻辑 释放锁的过程及源码剖析 释放锁的过程及源码剖析 目前经过线程1、线程2使用ReentrantLock.lock()后 阅读全文
posted @ 2021-10-29 21:17 _繁茂 阅读(173) 评论(0) 推荐(0)
摘要:上一节,你应该学到了ReentrantLock底层基于AQS的3个小组件 state、owner、queue。并且了解了下一个线程1进行加锁修改owner和state的过程。还记得么?加锁成功后,如下图所示的状态: 首次加锁的时候,只使用到了owner和state这两个小组件,并没有涉及到等待队列。 阅读全文
posted @ 2021-10-29 19:45 _繁茂 阅读(167) 评论(0) 推荐(0)
摘要:上一章你应该掌握了Atomic的底层原理-CAS。接下来进入另一个重要的一个知识AQS。我们通过ReentrantLock这个类来讲讲AQS这个知识。 从上图可以看出,ReentractLock、ReadWriteReentractLock,这些锁API底层是基于AQS+CAS+volatile来实 阅读全文
posted @ 2021-10-27 10:02 _繁茂 阅读(185) 评论(0) 推荐(0)
摘要:经过volatile和synchronize关键字的底层原理的洗礼,不知道你是否有一种感觉,要想弄明白它们的原理是一个非常难的过程。为什么费这么大的力气要弄明白这些并发基础知识呢? 其实是为了之后更好的掌握并发组件、并发集合这些内容。JDK中的juc(并发包)的知识大体可以分为如下几块: 并发基础中 阅读全文
posted @ 2021-10-23 22:16 _繁茂 阅读(236) 评论(0) 推荐(0)
摘要:上一节你了解了什么是CAS、synchronized形成的锁的类型、重量级锁是用户态进程向内核态申请资源加锁过程,HotSpot Java对象结构,以及初步从3个层面分析了下synchronized的核心流程。还记得核心流程图么? 如下所示: 这一节我们仔细来分析下这个过程中,每一步的底层原理。我们 阅读全文
posted @ 2021-10-22 20:48 _繁茂 阅读(245) 评论(0) 推荐(0)
摘要:前几节你应该已经了解和掌握了Thread、ThreadLocal、Volatile这几个并发基础知识的底层原理。这一节,你可以跟我一起深入了解下synchronized关键字的底层原理和其涉及的基础知识。看完这篇成长记,你可以获取到如下几点: synchronized预备知识: 理解什么是CAS? 阅读全文
posted @ 2021-10-22 18:15 _繁茂 阅读(295) 评论(0) 推荐(0)
摘要:上一节我们基本了解Volatile的作用,从JMM层面简单分析了下volatile可见性的实现要求。发现JMM设定了一些操作要求,在这些要求下,可以保证线程间的可见性。可是具体实现是怎么实现的呢? 但是你要想理解这个实现是比较难的,之前提到按照三个层面给大家讲解。如下图所示: 其实上一节通过JMM分 阅读全文
posted @ 2021-10-22 15:44 _繁茂 阅读(208) 评论(0) 推荐(0)
摘要:前几节你应该学习到了Thread和ThreadLocal的底层原理,在接下来的几节中,让我们一起来探索volatile底层原理吧! 不知道你有没有这样的感受:有很多工程师都很难说清楚volatile这个关键字的作用或者原理。比如有的人压根不知道volatile的作用、应用场景;比如有的人也不知道什么 阅读全文
posted @ 2021-10-21 12:12 _繁茂 阅读(191) 评论(0) 推荐(0)
摘要:上一节你弄懂了ThreadLocal是什么、它的基本使用方式、get方法的底层原理。这一节让继续深入研究下: ThreadLocal的set源码原理 JVM的中的强引用、弱引用、软引用、虚引用 弱引用在ThreadLocal的应用 ThreadLocal内存泄漏问题分析 ThreadLocal应用场 阅读全文
posted @ 2021-10-21 08:50 _繁茂 阅读(135) 评论(0) 推荐(0)
摘要:上一节你应该学习了thread的基本知识和源码原理,熟悉了线程的应用场景。这一节来学习下和Thread相关的一个类,ThreadLocal。 什么是ThreadLocal? 什么是ThreadLocal? 字面意思是线程本地变量的意思。用一句话解释就是:线程本地的变量副本,属于每个线程自己独有的。 阅读全文
posted @ 2021-10-20 23:29 _繁茂 阅读(181) 评论(0) 推荐(0)
摘要:画一张好图的意义? 作为程序员的你,你经常做的除了起给变量和类起名字、另一就是画图了。抛开起名字这个令人头疼的问题,画图对我们来说是一个表达想法非常不错的方法。 因为画图可以清晰的表述你的思维框架,帮你梳理逻辑,更好的传达信息。 有的人跟我说画图是一项费时费力的活,的确是这样。但是你要换一个思路想想 阅读全文
posted @ 2021-10-20 21:16 _繁茂 阅读(873) 评论(0) 推荐(0)
摘要:相信你经过集合篇的成长,已经对JDK源码的学习轻车熟路了。接下来你将一起和我进入后半篇的学习。让我们开始吧! 在接下来10分钟,你将学习到thread 的源码原理、线程的状态变化、线程的常用场景。 Thread基础回顾 Thread基础回顾 什么是Thread? Thread顾名思义,是线程。你应该 阅读全文
posted @ 2021-10-19 12:00 _繁茂 阅读(699) 评论(0) 推荐(0)
摘要:这一节主要是抛出一些面试题让大家检验一下学习成果,也会小结一下集合篇的知识点。 所以不会特别长。 练习-模拟面试 练习-模拟面试 先给大家讲一个简单的面试场景 快手Java面试一、二面: (一面一般会问一些各种基础,比如集合、并发、锁、JVM、MySql、Redis,IO模型,网络模型等基本原理和知 阅读全文
posted @ 2021-10-19 10:16 _繁茂 阅读(169) 评论(0) 推荐(1)
摘要:LinkedHashMap的源码底层原理 LinkedHashMap继承自HashMap,但是它的底层增加了一个链表来维护插入或者访问顺序,使得LinkedHashMap变动有顺序性。如下图所示: 上图中可以看出,LinkedHashMap继承了HashMap,多了两个成员变量,tail和head指 阅读全文
posted @ 2021-10-18 22:59 _繁茂 阅读(150) 评论(0) 推荐(0)
摘要:HashMap基本原理和优缺点 HashMap基本原理和优缺点 一句话讲, HashMap底层数据结构,JDK1.7数组+单向链表、JDK1.8数组+单向链表+红黑树。 HashMap的3个底层原理 HashMap的3个底层原理 在看过了ArrayList、LinkedList的底层源码后,相信你对 阅读全文
posted @ 2021-10-18 21:48 _繁茂 阅读(716) 评论(0) 推荐(1)
摘要:上一节你看过了LinkedList的add方法源码,是不是已经打开了思路呢?其实核心原理就是辅助指针+Node双向链表数据结构而已。 相信经过前面的学习,你应该热身完毕了,之后的学习可以让我们可以加快速度了。 GO!GO! 这一节你还需要深入LinkedList的其他方法探索下它们的底层原理是什么。 阅读全文
posted @ 2021-10-18 09:57 _繁茂 阅读(155) 评论(0) 推荐(1)
摘要:LinkedList初探 LinkedList初探 作为Java工程师,LinkedList你可能用的不多,大多你总是在new ArrayList。面试很多时候总是拿LinkedList和ArrayList的做对比。总会问你ArrayList 和 LinkedList 的区别是什么?它俩是不是线程安 阅读全文
posted @ 2021-10-17 22:18 _繁茂 阅读(136) 评论(0) 推荐(1)
摘要:写在前面的话 写在前面的话 有的同学问我,开始讲的很基础,节奏比较慢,这个是因为一个为了让大家慢慢进入状态,后面的节奏会越来越快的,大家不要着急,另一个是因为简单的东西重复,温故而知新,更希望给你们带来的是思想和观念的成长,这个需要铺垫。这个有点像练武功,要想练就高深的武功,需要循序渐进,不然很容易 阅读全文
posted @ 2021-10-16 21:30 _繁茂 阅读(141) 评论(0) 推荐(1)
摘要:无论是程序员的工作、学习,还是生活中的事情。都可以遵循这样一条原则:“,简单的事情重复做,正确的事情重复做。” 这样的努力会让你走到正道上,少走很多弯路。从小司机变成老司机。 上一节你应该已经掌握了ArrayList的扩容原理,System.arrayCopy方法,还有看源码的一些思想和方法。这一节 阅读全文
posted @ 2021-10-16 13:20 _繁茂 阅读(135) 评论(0) 推荐(1)
摘要:上一节相信你不光学会ArrayList构造函数的知识,更学会了先脉络后细节、连蒙带猜的思想。在之后的几节中,你将学会ArrayList常用方法的源码原理。学完之后,你将不会再被ArrayList的面试题问倒了,更可以得心应手的使用ArrayList。 今天这一节,你主要可以学到以下几点: Array 阅读全文
posted @ 2021-10-15 17:39 _繁茂 阅读(178) 评论(0) 推荐(1)
摘要:为了让广大工程师们更好的提升个人技术能力和思想,我将开通一个大专栏《成长记》系列,会包含Java架构和大数据从底层技术到源码原理的分享,敬请关注! 无论作为Java程序员还是大数据工程师的你,工作时间久了,可能很多底层和基础技术已经还给你的大学老师或者80%已经丢在脑后了。比如你可能已经不记得网络模 阅读全文
posted @ 2021-10-15 16:10 _繁茂 阅读(242) 评论(0) 推荐(1)
摘要:上一节我们主要分析了RecordAccumulator通过BufferPool申请内存的源码原理,在之前的分析中,在KafkaProducer发送消息时,把消息放入内存缓冲区中主要分为了三步。如下: 而且之前我们主要分析了前两步的代码,如下注释所示: public RecordAppendResul 阅读全文
posted @ 2021-10-11 23:35 _繁茂 阅读(172) 评论(0) 推荐(0)
摘要:之前三节我们主要分析了KafkaProducer是如何将消息放入到内存缓冲区的。 上面的逻辑只是Accumulator.append()的一段核心逻辑而已,还记得之前我们分析过的KafkaProducerHelloWorld的整体逻辑么? 之前分析的代码逻辑如下图所示: 从最开始配置解析,消息对象R 阅读全文
posted @ 2021-10-11 22:28 _繁茂 阅读(368) 评论(0) 推荐(0)
摘要:上一节我们分析到如何将消息放入内存缓冲器主要分三步,如下图所示: 我们重点分析了getOrCreateDeque()方法,它主要创建了如下数据结构,如下所示: 这一节我们继续向下分析,看看如何通过BufferPool申请内存空间NIO的多块内存ByteBuffer的。 BufferPool的创建 内 阅读全文
posted @ 2021-10-09 21:58 _繁茂 阅读(207) 评论(0) 推荐(0)
摘要:之前我们分析了Producer的配置解析、组件分析、拉取元数据、消息的初步序列化方式、消息的路由策略。如下图: 这一节我们继续分析发送消息的内存缓冲器原理—RecordAccumulator.append()。 如何将消息放入内存缓冲器的? 在doSend中的,拉取元数据、消息的初步序列化方式、消息 阅读全文
posted @ 2021-10-07 13:39 _繁茂 阅读(234) 评论(0) 推荐(0)
摘要:Kafka成长记的前4节我们通过KafkaProducerHelloWorld分析了Producer配置解析、组件组成、元数据拉取原理。 但KafkaProducerHelloWorld发送消息的代码并没有分析完,我们分析了如到了如下图所示的位置: 接下来,我们继续往下分析,这一节我们主要分析下发送 阅读全文
posted @ 2021-10-07 08:46 _繁茂 阅读(266) 评论(0) 推荐(0)
摘要:上一节结尾,我们总结道: 初始化KafkaProducer时并没有去拉取元数据,但是创建了Selector组件,启动了Sender线程,select阻塞等待请求响应。由于还没有发送任何请求,所以初始化时并没有去真正拉取元数据。 真正拉取元数据是在第一次send方法调用时,会唤醒唤醒Selector之 阅读全文
posted @ 2021-10-06 09:37 _繁茂 阅读(278) 评论(0) 推荐(0)
摘要:上一节我们分析了Producer的核心组件,我们得到了一张关键的组件图。你还记得么? 简单概括下上面的图就是: 创建了Metadata组件,内部通过Cluster维护元数据 初始化了发送消息的内存缓冲器RecordAccumulator 创建了NetworkClient,内部最重要的是创建了NIO的 阅读全文
posted @ 2021-10-06 08:28 _繁茂 阅读(378) 评论(0) 推荐(0)
摘要:上一节我们主要从HelloWorld开始,分析了Kafka Producer的创建,重点分析了如何解析生产者配置的源码原理。 public KafkaProducer(Properties properties) { this(new ProducerConfig(properties), null 阅读全文
posted @ 2021-10-06 07:26 _繁茂 阅读(297) 评论(0) 推荐(0)
摘要:成长记不会介绍太对一些kafka的基础知识,如果有需要的话,之后会有专门的《小白起步营》。成长记的默认大家对kafka的一些概念是熟知的、默认也是会基本Kafka的部署的。当然为了照顾一些小白,第一次涉及的知识我会简单介绍和解释的,熟悉的人就当回顾吧。简单的事情重复做有时也是好事。 Kafka成长记 阅读全文
posted @ 2021-10-05 22:59 _繁茂 阅读(227) 评论(0) 推荐(0)
摘要:前面10节的回顾 通过前面10节SpringBoot成长记的分析,你应该对SpringBoot的原理和设计思想有了很清晰的认识了。 最后这一节呢,我们将之前每一节最重要的知识点,提取出来一个总结。 第一节成长记1:你真的懂SpringBoot吗? 我们通过去官方文档寻找SpringBoot核心功能, 阅读全文
posted @ 2021-10-04 08:36 _繁茂 阅读(234) 评论(0) 推荐(0)
摘要:之前我们已经分析SpringBoot在run方法时,它会执行的refresh()容器的操作。 在SpringBoot中,refresh()有十几个方法,每个方法的大重要程度是不一样的,我们通过抓大放小的方式,分析处理上图3个核心逻辑。 并且已经研究完了invokeBeanFactoryPostPro 阅读全文
posted @ 2021-10-03 23:02 _繁茂 阅读(408) 评论(0) 推荐(0)
摘要:上一节我们主要分析了refreshContext中,主要有3个逻辑,如下图: 上一节重点解析了invokeBeanFactoryPostProcessors执行容器扩展点,实现了自动装备配置、第三方执行扩展的执行。 今天我们继续分析refreshContext另一个重要的逻辑onRefresh()逻 阅读全文
posted @ 2021-10-03 21:57 _繁茂 阅读(309) 评论(0) 推荐(0)
摘要:前面我们摸清楚了整个invokeBeanFactoryPostProcessors方法的if-else逻辑和3个for循环的核心脉络逻辑。 接下来我们来看下细节,我会通过抓大放小的思想,带大家看到在扩展点执行的过程中,最最要的有哪一些。 SpringBoot的自动装配配置如何做到的、第三方技术如何进 阅读全文
posted @ 2021-10-03 20:55 _繁茂 阅读(507) 评论(0) 推荐(0)
摘要:目前我们分析的代码已经到了容器处理相关的SpringBoot原理,代码如下: public ConfigurableApplicationContext run(String... args) { //DONE 扩展点 SpringApplicationRunListeners listeners. 阅读全文
posted @ 2021-10-03 19:54 _繁茂 阅读(195) 评论(0) 推荐(0)
摘要:前面你熟悉了SpringBoot的扩展点SpringApplicationRunListeners的设计,配置文件ConfigurableEnvironment的抽象封装。其实这些都还不是它最核心的,最最核心的时Spring的容器的创建和准备,自动配置的装配,tomcat的容器的启动。 这一节我们就 阅读全文
posted @ 2021-10-02 07:38 _繁茂 阅读(269) 评论(0) 推荐(0)
摘要:上一节的创建了容器对象,核心就是创建了Context和BeanFactory对象,内部初始化了Reader和Scanner,加载了一些内部Bean等。 已经分析的逻辑代码如下: public ConfigurableApplicationContext run(String... args) { / 阅读全文
posted @ 2021-10-02 07:22 _繁茂 阅读(281) 评论(0) 推荐(0)
摘要:上一节,我们主要了解了SpringBoot的一个扩展点设计SpringApplicationRunListeners。并没有找到我们想要找到的Spring容器创建和web容器启动、自动装配配置的这些核心功能。 之前我们说过,xxxxEnvironment表示了配置文件的封装,这一节就让我们来看下,S 阅读全文
posted @ 2021-10-01 22:29 _繁茂 阅读(234) 评论(0) 推荐(1)
摘要:上一节我们熟悉了SpringApplication的创建和run方法的脉络。这一节就来先分析下脉络的中第一个比较有意思的扩展点—SpringApplicationRunListeners。 如下: SpringApplicationRunListeners在run方法中位置 在之前的run方法中,很 阅读全文
posted @ 2021-10-01 14:57 _繁茂 阅读(245) 评论(0) 推荐(0)
摘要:上一节我们提到过,认识一个新技术的时候,通常是从一个入门的HelloWorld开始,之后阅读它的一些入门文档和书籍、视频,从而掌握它的基本使用。 这一节我就来带大家从HelloWorld开始,先摸清楚SpringBoot的核心脉络,之后再来逐步分析透彻SpringBoot,从而精通它。 从搭建Hel 阅读全文
posted @ 2021-10-01 13:49 _繁茂 阅读(247) 评论(0) 推荐(0)
摘要:众所周知,Spring是java中应用最为广泛的框架,而近些年来SpringBoot的兴起,让Spring的应用和便利更上一层楼。 今天我们第一节,就来认识下SpringBoot给我带来什么,它的核心特点是哪些。 认识一个新技术的时候,通常是从一个入门的HelloWorld开始,之后阅读它的一些入门 阅读全文
posted @ 2021-10-01 10:14 _繁茂 阅读(385) 评论(0) 推荐(0)