自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Netty网络基础的通俗理解(网络&操作系统)

Http 服务器是如何并发处理更多连接的?被讨论最多的 IO 模型?Reactor 与 Proactor的区别是什么?

2023-12-17 20:46:23 107

原创 JVM:如果是你,你如何解决跨代引用的问题?(记忆集和卡集)

这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果对这部分内容感到枯燥或者疑惑,可以先放下看,等后续遇到要使用它们的实际场景、实际问题时再结合问题,再回来阅读和理解。

2023-11-13 22:12:54 211

原创 JVM:如何通俗的理解并发的可达性分析

比如在某一个GC roots 的对象图 已经标记完成了,此时用户线程再创建一个对象引用到前面已经编辑完成的对象图中,那么由于新插入的对象引用没有对标记到,那么再GC 时大概率就会被清除,这样的结果是致命的(类比下日常工作中的情况)。**原始快照(破坏的是第二个条件):**当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次。另一种是把原本存活的对象错误标记为已消亡,这就是非常致命的后果了,程序肯定会因此发生错误。

2023-10-04 15:23:55 98

原创 Zuul源码解析(二)

ZuulProxyAutoConfiguration 如何触发?ZuulProxyAutoConfiguration 主要自动配置了那些东西组件?Zuul 又是怎么和 MVC 中的 DisPatcherServlet 联系起来的?

2023-04-23 21:03:22 649

原创 Zuul源码解析(一)

Zuul 的核心流程、RouteLocator 、DiscoveryClientRouteLocator、Zuul 默认的 filter 等等源码解析

2023-04-23 20:55:37 658

原创 技术人也要具备产品思维

## 写在前面产品思维,这四个字,相信大家都不陌生。去年,我在一个付费圈子看到一篇文章,关于「到底什么是产品思维」,觉得写的非常好,至少比市面上一堆讲概念、故作高端的文章要通俗易懂。产品思维可以说是人类最底层的能力,它可以应用于任何行业,现在结合我最近两三年的小白职场经历,也和大家聊聊这个东西。## 技术思维&产品思维在说产品思维之前,首先想先和大家扯一下技术思维。我们都是做技术的,所以我就拿程序员做个类比。程序员的思维我把他叫做技术思维,因为我都是程序员出身,所以我对技术思维是非常理解的,举个例

2022-04-30 10:31:14 521

原创 再扯 Spring 源码_白话文

在2021年之前,我在网上看过很多beam的 生命周期或者Aop相关源码的文章,并且自己简单实现了一个玩具级的Ioc 容器。所以如果说在面试过程中,面试官跟我扯beam的 生命周期或者Aop相关实现的话,我是非常的自信自己可以扯一大堆东西出来。但是如果再深入的话,我就很难说出来了。比如 @Bean 是在哪里实现的?@AutoWired 是如何实现的,核心是实现类是什么,Spring 的事件原理等等。我真的很好奇,以至于今年年初,带着这些问题大致又刷了一篇。对beanFactory甚至对Spring的核心思

2022-03-10 21:16:20 354

原创 Spring Boot WebMvc自动配置原理

Spring Boot WebMvc自动配置原理每次写文章之前,我都习惯扯一下最近,我为什么写这篇文章。这一切都源于我对 WebMvcConfigurer 好奇,为什么 Spring boot 配置 WebMvc 只需要实现 WebMvcConfigurer,然后重写对应的方法就可以?我带着这个问题,看了 Spring Mvc 的源码,看了一次请求的大致过程。但是我看完还是没有答案。因为当前启动容器后,DispatcherServlet 的各种组件都已经初始化好了。那么是在何时初始化呢,于是,就有了这篇文

2021-10-10 15:09:00 531

原创 ThreadPoolExcutor源码解析_通俗易懂

写在前面是这样的,我简单说一下。我之前写了一篇关于 CompletableFuture 的源码分析。但是在学习过程中,简单看了一下 ForkJoinPool 的源码,发现很多状态名称或者变量属性非常的模糊。比如 ForkJoinPool 中的 ctl 是什么,他是怎么控制线程数量的等等。这些变量在 ThreadPoolExcutor 源码中都是非常重要的属性。由于我当时只是简单了解线程池基本原理,但压根就不知道这些属性是什么东西,当时就非常的难受。而我也对 ThreadPoolExcutor 源码非常的好

2021-09-04 16:36:29 637

原创 CompletableFuture源码解析

写在前面刚开始是想着直接写 CompletableFuture 的使用,后来又想到 CompletableFuture 的基本使用,大家多多少少都会用。于是就研究了一下 CompletableFuture 源码,给大家带来一点不一样的学习体验。所以就有了第二个栏目和第四个栏目由于 CompletableFuture 默认的线程池是 ForkJoinPool,在讲 CompletableFuture 之前觉得有必要先简单介绍一下 ForkJoinPool。ForkJoinPool 工作原理ForkJo

2021-08-21 14:08:17 2030

原创 JVM:安全点的细节实现

这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果对这部分内容感到枯燥或者疑惑,可以先放下看,等后续遇到要使用它们的实际场景、实际问题时再结合问题,再回来阅读和理解。

2023-11-13 22:13:48 180

原创 JVM:卡表元素如何维护?(写屏障)

编译优化带来并发的有序性问题)。伪共享是处理并发底层细节时一种经常需要考虑的问题,现代中央处理器的缓存系统中是以缓存行(Cache Line)为单位存储的,当多线程修改互相独立的变量时,如果这些变量恰好共享同一个缓存行,就会彼此影响(写回、无效化或者同步)而导致性能降低,这就是伪共享问题。另外,一旦收集器在写屏障中增加了更新卡表操作,无论更新的是不是老年代对新生代对象的引用,每次只要对引用进行更新,就会产生额外的开销,不过这个开销与Minor GC时扫描整个老年代的代价相比还是低得多的。

2023-11-13 22:11:59 220

原创 JVM:根节点枚举的细节实现

这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果对这部分内容感到枯燥或者疑惑,可以先放下看,等后续遇到要使用它们的实际场景、实际问题时再结合问题,再回来阅读和理解。

2023-09-19 19:42:29 71

原创 全链路日志追踪

全局追踪Id 错乱问题总结

2023-04-10 16:14:04 980

原创 并发设计模式(三)重要

三种最简单的分工模式并发编程领域里,解决分工问题也有一系列的设计模式,比较常用的主要有 Thread-Per-Message 模式、Worker Thread 模式、生产者 - 消费者模式等等。Thread-Per-Message 模式在编程领域也有很多类似的需求,比如写一个 HTTP Server,很显然只能在主线程中接收请求,而不能处理 HTTP 请求,因为如果在主线程中处理 HTTP 请求的话,那同一时间只能处理一个请求,太慢了!怎么办呢?可以利用代办的思路,创建一个子线程,委托子线程去处理 H

2022-05-05 10:37:22 292

原创 并发设计模式(二)

多线程版本的 IfGuarded Suspension模式Guarded Suspension模式也被叫做Guarded Wait 模式,我也更倾向这种叫法。实际上,本质就是是一种等待唤醒机制的实现。我觉得这个模式比较经典的一个应用是异步转同步(比如Dubbo 中 DefaultFuture 这个类也是采用的这种方式)又比如用户通过浏览器发过来一个请求,而服务调用方A接受到这个请求,而这个请求需要请求其它服务提供方B的某个接口来返回结果。然而这个服务B暴露出来的交互方式并不是Http的方式,而是通过

2022-05-04 19:35:41 206

原创 并发设计模式(一)

避免共享的设计模式随便扯扯,刚开始我学到这里的时候,我有点茅舍顿开的感觉。怎么说呢,比如我现在呆的公司,有一个批量导出订单excel的功能。这个功能前员工已经实现了,当时我在阅读这部分代码的时候就觉得写这个代码的人很吊。他在代码中,利用多线程并发的批量请求数据,多线程封装符合导出格式的数据,而此时,他不是直接就写到excel中,而是先到一个阻塞队列中,然后另外开一个线程从队列中读数据写入到excel中(还有很多细节)。当时我就在想,他是怎么想到这种处理方式。原来这就是一种并发设计模式,就是下面会讲到的生产

2022-05-03 18:18:03 581

原创 记录:工作中遇到的两个问题

两个问题前段时间遇到两个问题,对于现阶段的我来说,有点刺手问题1: FeignClient的configuration被覆盖我在调用 payment-service(其它部门提供的jar) 的 listPaymentOrderRela() 接口时报 json 解析错误:这个报错的意思是说,你传过来的参数,不是 payment-service 的 listPaymentOrderRela() 接口想要的。这时候我就觉得是 编码器 加载顺序的问题(DefaultEncoder 在公司公用的基础组

2021-12-28 17:14:34 422

原创 Java 为什么再造管程(六)

文章导读:并发编程理论篇(一)可见性,原子性,有序性的源头(二)Java 如何解决可见性、有序性和原子性问题(三)为什么存在等待 - 通知机制(四)宏观角度看并发(五)管程:并发编程的万能钥匙在前面,我通过白话文的方式,简单介绍了并发编程的理论篇,感兴趣的可以看看前面的文章。接下来,简单聊聊并发编程工具篇。Java 为什么再造管程我们都知道,Java 语言本身提供的 synchronized 是管程的一种实现。另外,Java SDK 并发包通过 Lock 和 Condition 两个接口.

2021-12-06 22:36:27 248

原创 为什么存在等待 - 通知机制(三)

细粒度锁的代价上一章说到,用不同的锁对受保护资源进行精细化管理,使用细粒度锁可以提高并行度,是性能优化的一个重要手段。然而,天底下没有免费的午餐。使用细粒度锁是有代价的,这个代价就是可能会导致死锁。// 经典的一个转账例子 ,会导致死锁class Account { private int balance; // 转账 void transfer(Account target, int amt){ // 锁定转出账户 synchronized(this) {

2021-11-17 22:46:25 688 1

原创 Java 如何解决可见性、有序性和原子性问题(二)

在上一篇文章中,你可能已经知道了,导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,但是这样问题虽然解决了,我们程序的性能可就堪忧了。合理的方案应该是按需禁用缓存以及编译优化。那么,如何做到“按需禁用”呢?对于并发程序,何时禁用缓存以及编译优化只有程序员知道,那所谓“按需禁用”其实就是指按照程序员的要求来禁用。所以,为了解决可见性和有序性问题,只需要提供给程序员按需禁用缓存和编译优化的方法即可。Java 内存模型是个很复杂的规范,可以从不同的视角

2021-11-16 23:39:35 585

原创 可见性,原子性,有序性的源头(一)

最近在学习极客时间的《并发编程实战》。我秉承着学习不仅是一个输入过程,输出也同等重要!下面大部分内容都是我在极客时间的笔记,但也有我的一些总结和见解。并发程序幕后的故事这些年,CPU、内存、I/O 设备都在不断迭代,不断朝着更快的方向努力。但是,在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度差异。CPU 和内存的速度差异可以形象地描述为:CPU 是天上一天,内存是地上一年(假设 CPU 执行一条普通指令需要一天,那么 CPU 读写内存得等待一年的时间)。内存和 I/O 设备的速度差异就

2021-11-15 23:52:18 586

原创 说说代码的坏味道

说说代码的坏味道最近公司在要求学习极客时间的《代码之丑》,我花了大概一两天的时间看了一下,篇幅不长,很容易理解,基本看完了。我秉承着学习是一个输入的过程,但也不要忘了输出。在这个专栏里,作者是列举了15项左右的代码坏味道清单。我不完全认同,有一些很难避免,也有一些我觉得问题不大。比如不要用else,尽量所有参数都用 final 修饰等等下面,我简单整理了命名、大类、长参数、ifelse、封装,不一致、落后的代码风格等等几项。命名比如 processChapter(处理文章),你可能一看,发现没什么

2021-10-17 15:53:42 627

转载 Spring AOP 源码分析

最近一个星期在研究 Spring AOP 源码,在此过程中发现几遍源码分析的文章很不错,推荐给需要的同学。Spring AOP 源码解析 走马观花,看个大概的,推荐。Spring 源码剖析(六)AOP实现原理剖析 在分析过程中列了执行时序图,思路清晰。推荐Spring AOP 源码分析系列文章导读Spring AOP 源码分析 - 筛选合适的通知器Spring AOP...

2019-12-21 18:22:23 137

转载 Spring IOC 容器源码分析

文章目录引言BeanFactory 简介启动过程分析创建 Bean 容器前的准备工作创建 Bean 容器,加载并注册 BeanBeanDefinition 接口定义customizeBeanFactory加载 Bean: loadBeanDefinitionsdoRegisterBeanDefinitions:processBeanDefinition 解析 bean 标签注册 BeanBean ...

2019-12-14 19:05:01 127

转载 从 0 开始学习 Git 与 GitHub

从 0 开始学习 Git 与 GitHub这篇我就不自己写了,在学习 Git 与 GitHub 的时候发现了几个篇文章,真的写的很好,在这里推荐给大家。如果是初学者的话,你们应该对 Git 和 GitHub 之间的关系很模糊吧!据初学者的了解,Git 就是托管代码的,甚至有的还不知道 Git 是干什么的。那 GItHub 呢?学习开源项目的?是的,没错,他们是可以这样用,但是觉得你们对 Git...

2018-12-01 22:00:22 287

原创 Redis 的特性和持久化

Redis 的特性多数据库一个 Redis 实例可以包括多个数据库。客户端可以指定连接某个 redis 实例的哪个数据库,就好比一个 mysql 中创建多个数据库,客户端连接时指定连接哪个数据库。一个 redis 实例最多可提供 16 个数据库,下表从 0 到 15,客户端默认连接第 0 号数据库,也可以通过 select 选择连接哪个数据库。例如连接 1 号库:连接 0 号库:mo...

2018-11-30 21:50:30 183

原创 Redis 字符串(Hash)

Redis 中的 Hash 类型可以看成具有 String Key 和 String Value 的 Map 容器,,底层是个哈希表。所以该类型非常适合于存储值对象的信息。如 Username、Password 和 Age 等。如果 Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个 Hash 可以存储 (2^32-1 ) 个键值对。在 Redis 中,Hash 类型可以...

2018-11-30 21:49:00 578

原创 Redis 有序集合(SortedSet)

SortedSet 和 Set 类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个 Set 中。它们之间的主要差别是 SortedSet 中的每一个成员都会有一个分数 (score) 与之关联,Redis 正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管 SortedSet 中的成员必须是唯一的,但是分数 (score) 却是可以重复的。在 SortedS...

2018-11-29 21:20:13 238

原创 Redis 集合(Set)

在 Redis 中,Set 无序列表,集合元素唯一,底层数据结构是哈希表,故查询、插入和删除的时间复杂度都是 O(1)。Set 可包含的最大元素数是(2^32 -1)。和 List 类型相比,Set 类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个 Sets 之间的聚合计 算操作,如 unions、intersections 和 differences。由于这些操作均在服务端完成,因...

2018-11-29 21:19:54 445 1

原创 Redis 列表(List)

在 Redis 中,List 类型是按照插入顺序排序的字符串双向链表。和数据结构中的普通链表 一样,我们可以在其头部 (left) 和尾部 (right) 添加新的元素。在插入时,如果该键并不存在,Redis 将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List 中可以包含的最大元素数量是 4294967295。两端插入lrange key...

2018-11-28 11:15:51 241

原创 Redis 字符串(String)

字符串类型是 Redis 中最为基础的数据存储类型,存储的字符串 value 最多可以容纳的数据长度为 512 M赋取值set key value:设定 key 持有指定的字符串 value,如果该 key 存在则进行覆盖操作。总是返回”OK”get key:获取 key 的 value。如果与该 key 关联的 value不是 String类型,redis 将返回错误信息,因为get命令只...

2018-11-27 11:51:21 142

原创 Redis 基础入门

NoSQLNoSQL(Not Only SQL),意思是“不仅仅是 SQL”,是一项全新的数据库理念,泛指非关系型数据库。为什么需要 NoSQL随着互联网 web2.0 网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应对 web2.0 网站,特别在超大规模和高并发的 SNS 类型的 web2.0 纯动态网站已经显得力不从心,暴露...

2018-11-26 21:08:14 144

原创 Maven 分模块开发

Maven 的分模块开发在此之前,你的需要明白什么是 maven 的继承和 maven 的聚合。何为 maven 的继承?继承是为什么消除重复,如果将dao、service、web 分开创建独立的工程则每个工程的 pom.xml 文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本等,可以将这些重复的内容配置提取出来在父工程的 pom.xml 中定义。何为 maven 的...

2018-11-23 22:22:40 238

原创 Maven(二)

Maven 坐标Maven 的很强大的一个功能就是管理项目依赖,为了能自动化的精确获取到项目依赖,Maven 就必须为其唯一标识,Maven 通过坐标来构建唯一标识。比如上一章中的一个 Maven 的 java 工程,我们在创建工程时已经书写了具体的坐标,我们可将该工程 install 到本地仓库,我们在分模块开发时如果依赖该工程,可将该工程的 jar 包到进来即可!平面几何中,使用 (x,...

2018-11-22 20:11:28 180

原创 Maven(一)

Maven 简介Maven 是 apache 下的一个纯 java 开发的一个开源项目,它是一个项目管理工具我们平时开发中,除了编写源代码,每天有一部分时间都花在了编译、运行单元测试、生成文档、打包和部署上面,这就是构建。多次重复的做这种工作,浪费了大量我们的时间,所以我们可用 Maven 来开发项目。Maven 将项目构建的过程进行标准化,每个阶段使用一个命令完成,又或者一个命令完成构建,也...

2018-11-21 20:48:21 246

原创 Hibernate 的查询优化

Hibernate 提升性能的一种手段是抓取策略,可以在获取关联对象的时候,对发送的语句进行优化,但是往往抓取策略需要和延迟加载一起使用提升性能。下面的类级别查询优化和关联级别查询优化需要用到延迟加载或者延迟加载和抓取策略一起协同来优化查询,提升性能。类级别查询优化我们测试下面的程序一起玩玩延迟加载是什么,又是如何优化查询的。。 @Test // get方法 : 立即加载.执行方法时立即...

2018-10-16 17:23:59 670

原创 Hibernate 的检索方式

在实际开发项目中,对数据进行最多的操作就是查询,数据的查询在所有 ORM 框架中都占有极其重要的地位。那么,如何利用 HIbernate 查询数据呢?接下学习Hibernate 的检索方式。Hibernate 的检索方式主要有 5 种,分别为导航对象图检索方式、OID 检索方式、HQL 检索方式、QBC检索方式和原生 SQL 检索方式。下面就对这 5 种检索方式一一向详解。对象图导航检索根据...

2018-09-30 20:50:09 312

原创 HIbernate 的一对多和多对多

数据库中多表之间存在着三种关系,也就是系统设计中的三种实体关系,分别是一对一,一对多和多对多。这里我主要详解一对多和多对多。Hibernate 的一对多关联映射一对多在表中的表达例如:建表原则:在多的一方创建外键,指向一的一方的主键一对多在实体中的表达例如客户与联系人之间的关系(一个客户可以对应多个联系人)在HIbernate 中,是采用 java 对象关系来描述数据表之间的关系...

2018-09-29 23:27:34 438

原创 Hibernate 进阶

Hibernate 持久化类的编写规则持久化类HIbernate 是持久层的 ORM 映射框架,专注于数据的持久化工作。所谓持久化,就是将内存中的数据永久存储到关系数据库中。那么知道了什么是持久化,什么又是持久化类呢?其实所谓的持久化类指的是一个java类与数据库表建立了映射关系,那么这个类称为持久化类。其实你可以简单的理解为持久化类就是一个java 类有了一个映射文件与数据库的表建立了关系...

2018-09-28 22:10:26 166

空空如也

空空如也

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

TA关注的人

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