03 2023 档案

摘要:1 前言 上节我们看了一下线程安全的原子性、有序性、可见性,这节我们回到CPU多级缓存的问题,就是各个缓存中一致性的问题,这节我们就来看一下MESI一致性协议。 2 MESI缓存一致性协议 MESI协议也叫做缓存一致性协议,主要是用来进行协调多核CPU的高级缓存的数据一致的。 MESI一致性协议定义 阅读全文
posted @ 2023-03-28 14:53 酷酷- 阅读(203) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们了解了CPU缓存结构以及我们的Java内存模型结构以及JMM的基本指令,我们能感受到的就是线程并发后带来的数据问题、执行问题,也就涉及到我们平时常说的可见性、有序性、原子性,那么这节我们来大概看看这三者的理解。 2 可见性 多个线程同时对某一个共享变量进行操作的时候,存在线程A的操 阅读全文
posted @ 2023-03-28 08:24 酷酷- 阅读(124) 评论(0) 推荐(0) 编辑
摘要:1 前言 在进行 Java 并发学习的时候,我们需要有个前置基础的概念和知识理清楚,然后才能进行后面深入的学习。这节我们就来看看CPU多级缓存模型以及Java内存模型。 2 CPU多级缓存模型 我们先从CPU的多级缓存架构讲起,下面画个图整体说下CPU多级缓存架构: 2.1 高速缓存的意义 CPU与 阅读全文
posted @ 2023-03-28 07:41 酷酷- 阅读(268) 评论(0) 推荐(0) 编辑
摘要:1 前言 关键字 volatile 大家平时可能会用到,或者看源码的时候都会遇到,在看这个关键字之前,我们先看点别的,先了解一下系统的CPU多级缓存,方便我们更好的理解。 2 CPU缓存 2.1 CPU缓存的来历 CPU是计算机的大脑,它负责执行程序的指令,而内存负责存数据, 包括程序自身的数据。在 阅读全文
posted @ 2023-03-27 06:44 酷酷- 阅读(190) 评论(0) 推荐(0) 编辑
摘要:1 bash: ps: command not found apt-get update && apt-get install procps 2 bash: ll: command not found echo "alias ll='ls -rltha'" >> ~/.bashrc && sourc 阅读全文
posted @ 2023-03-26 13:11 酷酷- 阅读(245) 评论(0) 推荐(0) 编辑
摘要:1 前言 前面分析了 Spring MVC 的创建过程,本章分析Spring MVC 是怎么处理请求的。我们这里分两步:首先分析 HtpServletBean、FrameworkServlet 和 DispatcherServlet 这三个 Servlet 的处理过程,这样大家可以明白从Servle 阅读全文
posted @ 2023-03-25 23:33 酷酷- 阅读(201) 评论(0) 推荐(0) 编辑
摘要:1 前言 本章将分析SpringMVC自身的创建过程。首先分析SpringMVC的整体结构,然后具体分析每一层的创建过程。 2 整体结构介绍 SpringMVC中核心Servlet的继承结构如图所示: 可以看到在Servlet的继承结构中一共有5个类,GenericServlet 和HttpServ 阅读全文
posted @ 2023-03-25 23:06 酷酷- 阅读(71) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们主要讲解下我们平时使用的 Synchronized,它的使用大家应该并不陌生。我们知道 Java 中的锁分为内置锁和显示锁,Synchronized 就是我们的内置锁,内置可以理解为我们只需要标记即可,加锁释放啥的JVM都帮我们做了,那么我们这节就好好来看看这个关键字。 另外我们的 阅读全文
posted @ 2023-03-24 08:04 酷酷- 阅读(719) 评论(0) 推荐(1) 编辑
摘要:1 前言 Java 本身是面向 OOP 编程的,我们代码中创建的对象经过编译装载进我们的 JVM 中,那么我们的实例对象在 JVM 中具体表现的结构是什么样的呢,就是我们这节要看的东西。 2 工具 在了解之前我们要看到实际的东西,就是我们可能知道有对象头、实例数据、对齐,但是这毕竟是概念,我们怎么看 阅读全文
posted @ 2023-03-24 07:06 酷酷- 阅读(182) 评论(0) 推荐(0) 编辑
摘要:1 前言 大家经常看源码会发现这个关键字,那么我们这节我们讲一下 transient 关键字,先看看它的的用法和作用: 用法:只能用于修饰成员变量 作用:Java 的 Serilizable 提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用序列化机制来保存它, 阅读全文
posted @ 2023-03-21 15:53 酷酷- 阅读(151) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们自己动手感受一下 HTTP的东西,我们知道 HTTP 协议是在应用层解析内容的,只需要按照它的报文的格式封装和解析数据就可以了,具体的传输还是使用的 Socket,我们基于上节的NIO Socket自己做一个简单的实现了HTTP协议的例子。 2 源码分析 因为HTTP 协议是在接收 阅读全文
posted @ 2023-03-21 08:30 酷酷- 阅读(230) 评论(0) 推荐(0) 编辑
摘要:1 前言 本节介绍Java 中 Socket 的用法,Java 中的 Socket 可以分为普通 Socket 和 NioSocket 两种,来感受下两者的使用。 2 普通 Socket 的用法 Java 中的网络通信是通过 Socket实现的,Socket分为 ServerSocket和 Sock 阅读全文
posted @ 2023-03-21 07:42 酷酷- 阅读(455) 评论(0) 推荐(0) 编辑
摘要:1 前言 Connector用于接收请求并将请求封装成 Request 和 Response 来具体处理,最底层是使用Socket 来进行连接的,Request 和 Response 是按照HTTP 协议来封装的,所以 Connector 同时实现了TCP/IP协议和HTTP 协议,Request和 阅读全文
posted @ 2023-03-20 23:34 酷酷- 阅读(175) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节讲了Container 自身的创建过程,Container处理请求是使用 Pipeline-Value管道来处理的,本节就详细分析一下 Pipeline-Value 管道。首先介绍它的处理模式,然后分析其实现方法。 2 Pipeline-Value处理模式 Pipeline-Value 阅读全文
posted @ 2023-03-20 23:07 酷酷- 阅读(54) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来看下 Container 哈,一样边看边记录一下,先通读一遍理解,理解完再记录加强一遍。 2 ContainerBase 的结构 Container 是 Tomcat 中容器的接口,通常使用的Servlet就封装在其子接口 Wrapper 中。Container一共有4个子接口 阅读全文
posted @ 2023-03-20 22:48 酷酷- 阅读(157) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来看下 Tomcat 中的生命周期哈,一样边看边记录一下,先通读一遍理解,理解完再记录加强一遍。 2 Lifecycle 接口 Tomcat 通过 orgapachecatalina.Lifecycle 接口统一管理生命周期,所有有生命周期的组件都要实现 Lifecycle 接口。 阅读全文
posted @ 2023-03-20 22:09 酷酷- 阅读(140) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来学习下 Tomcat,是一种 Servlet 容器,这节我们主要来看下 Tomcat 的整体结构以及启动过程,本文的整体思路以及内容大部分都是来自《看透 Spring MVC》,大家可以看看。 2 顶层结构 我们先来看下整体的一个结构图: Server:Tomcat 中最顶层的容 阅读全文
posted @ 2023-03-20 21:26 酷酷- 阅读(113) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们要开始 Spring MVC之旅了,大家应该知道Spring MVC 是基于 Servlet 实现的。所以要分析 Spring MVC,首先应追根溯源,弄懂 Servlet。Servlet是 server + applet 的缩写,表示服务器应用,也就是一种服务能力。那么这节我们就 阅读全文
posted @ 2023-03-20 07:52 酷酷- 阅读(86) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们看了下 ThreadLocal 的实现原理,这节我们来看下 InheritableThreadLocal 是用来干什么的呢? 我们首先看个简单的现象: 那我们把 ThreadLocal 换成 InheritableThreadLocal 的再来看下呢: 可以看到我们开辟的新线程里也 阅读全文
posted @ 2023-03-18 15:20 酷酷- 阅读(175) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们看下 ThreadLocal ,这个东西大家应该不陌生,经常在一些同步优化中会使用到它。很多地方叫线程本地变量,ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。也就是对于同一个ThreadLocal,每个线程通过get、set、re 阅读全文
posted @ 2023-03-17 07:23 酷酷- 阅读(294) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们聊聊 WeakReference 弱引用的作用,因为我们平时看源码的时候会发现一些对象是继承了这个类的,那么这个类是干什么的? 我的理解哈这个类是专门给 GC 标识用的,当一个类 A 继承了 WeakReference 就表示 A 如果没有别的强引用的话,我 GC 的时候是可以回收 阅读全文
posted @ 2023-03-16 08:18 酷酷- 阅读(823) 评论(0) 推荐(0) 编辑
摘要:1 前言 以前看源码的时候都是在依赖包中看的没做笔记也没记录,今天试着单独整个环境把 JDK 源码跑起来,这也既能方便调试还能写笔记注释。我用的版本是:jdk1.8.0_202,IDEA是:2021版本的哈,那么让我们开始搭建吧。 前提哈:首先你电脑上需要装了 JDK 的奥 2 搭建过程 2.1 创 阅读全文
posted @ 2023-03-15 16:24 酷酷- 阅读(303) 评论(0) 推荐(0) 编辑
摘要:1 前言 今天把排序的几个算法过一下,这节我们看一下快速排序,简单的来说就是先找位置再拆,我们看示例。 2 代码示例 /** * 快速排序 * 快排主要就是先找位置再拆 */ public static void quickSort(int[] arr, int start, int end) { 阅读全文
posted @ 2023-03-14 23:13 酷酷- 阅读(32) 评论(0) 推荐(0) 编辑
摘要:1 前言 今天把排序的几个算法过一下,这节我们看一下归并排序,简单的来说就是先拆再合,跟快排相反(快排时先找位置再两边拆),我们看示例。 2 代码示例 /** * 归并排序 * 特点就是 跟快排相反,快排是先找再拆分,归并是先拆再合 * 折半拆,指导拆分单个以后开始向上汇集 */ public st 阅读全文
posted @ 2023-03-14 22:32 酷酷- 阅读(20) 评论(0) 推荐(0) 编辑
摘要:常用导的一些命令 grep 平时查询的一些小方式 (1) grep '字符串' 匹配文件中包含 MANPATH 的那一行: cat manpath.config | grep 'MANPATH' (2) grep -v '字符串' 匹配文件中不包含 MANPATH 的那一行: cat manpath 阅读全文
posted @ 2023-03-14 21:27 酷酷- 阅读(27) 评论(0) 推荐(0) 编辑
摘要:1 前言 今天把排序的几个算法过一下,这节我们看一下希尔排序,简单的来说就是多次插入排序,我们看示例。 2 代码示例 /** * 希尔排序,也就是多次插入排序 * 可以参考插入排序,然后外边套一层间隙循环 * 间隙到最后为1,就跟插入排序一样了 */ public static void shell 阅读全文
posted @ 2023-03-14 17:33 酷酷- 阅读(21) 评论(0) 推荐(0) 编辑
摘要:1 前言 今天把排序的几个算法过一下,这节我们看一下插入排序,简单的来说就是从第2个元素往前寻找位置进行插入,我们看示例。 2 代码示例 /** * 插入排序 * 从第2个元素开始,往前插入 * 假设待排序的数量为:n * 要考虑的是: * 1、轮数还是 n-1 我们外层循环起始刚好是2 到 n * 阅读全文
posted @ 2023-03-14 17:17 酷酷- 阅读(149) 评论(0) 推荐(0) 编辑
摘要:1 前言 今天把排序的几个算法过一下,这节我们看一下直接选择排序,简单的来说就是默认某个位置为最小然后从位置后的元素逐个比较进行交换,我们看示例。 2 代码示例 /** * 直接选择排序 * 直接选择相当于直接把第 i 个看作是最大或者最小,然后依次跟后边的每个元素进行比较,比我小的就跟我交换一下 阅读全文
posted @ 2023-03-14 16:30 酷酷- 阅读(86) 评论(0) 推荐(0) 编辑
摘要:1 前言 今天把排序的几个算法过一下,这节我们看一下冒泡排序,简单的来说就是相邻两个两两交换,我们看示例。 2 代码示例 /** * 冒泡排序 * 相邻两个逐步交换,每轮选出一个最大的 * 假设待排序的数量为:n * 考虑的两点: * 1、外层循环,那要进行 n-1 轮,即可排完 所以外层的循环是 阅读全文
posted @ 2023-03-14 16:17 酷酷- 阅读(16) 评论(0) 推荐(0) 编辑
摘要:1 前言 记录一下平时常用的 ES 的一些基础操作。 2 基本的系统操作 GET /_cat/health?v 查看当前的集群状态信息 GET /_cat/nodes?v 查看集群节点信息 GET /_cat/indices?v 查看所有索引及数据大小 3 索引操作 PUT /mytest 创建一个 阅读全文
posted @ 2023-03-11 22:06 酷酷- 阅读(64) 评论(0) 推荐(0) 编辑
摘要:1 集群与分布式 集群和分布式处理都是使用多台服务器进行处理的,集群是每台服务器都具有相同的功能,处理请求时调用哪台服务器都可以,主要起分流的作用,分布式是将不同的业务放到不同的服务器中,处理一个请求可能需要用到多台服务器,这样就可以提高一个请求的处理速度,而且集群和分布式也可以同时使用,结构图如图 阅读全文
posted @ 2023-03-11 21:58 酷酷- 阅读(42) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来看看插件,插件是来干啥的呢?一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展。这样的 好处是显而易见的,一是增加了框架的灵活性。二是开发者可以结合实际需求,对框架进行 拓展,使其能够更好的工作。以 MyBatis 为例,我们可基于 MyBatis 插件机制实现 阅读全文
posted @ 2023-03-09 20:33 酷酷- 阅读(136) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来看一下 Mybatis 的缓存,Cache 是缓存接口,定义了一些基本的缓存操作,所有缓存类都应该实 现该接口。 MyBatis 内部提供了丰富的缓存实现类,比如具有基本缓存功能的 PerpetualCache ,具有 LRU 策略的缓存 LruCache ,以及可保证线程安全的 阅读全文
posted @ 2023-03-09 08:10 酷酷- 阅读(153) 评论(0) 推荐(1) 编辑
摘要:1 前言 上节带大家简单回顾了下 SqlSession以及内部的执行器的创建,那么这节我们就开始看我们的语句都是如何执行的。 调试代码: // xml <insert id="insertOne" parameterType="org.apache.ibatis.test.po.DemoPo" us 阅读全文
posted @ 2023-03-08 22:08 酷酷- 阅读(251) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们看到 MapperMethod 执行的前奏,看到其实都是调用的 SqlSession 去执行的,而 SqlSession 又是调用其内部的 Executor 来进行执行的,那么这节我们先来看下回顾这两者的创建过程,方便下节讲执行哈。 2 SqlSession 的创建 起源是通过我们 阅读全文
posted @ 2023-03-08 21:05 酷酷- 阅读(64) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们回顾了下 Mapper 接口的解析存放以及代理的入口和创建代理的过程,那么这节我们就来看下 MapperProxy 的代理执行逻辑。 2 源码分析 2.1 invoke 代理逻辑 Mapper 接口方法的代理逻辑首先会对拦截的方法进行一些过滤,以决定是否执行后续的操作。对应的代码如 阅读全文
posted @ 2023-03-06 20:44 酷酷- 阅读(137) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们分析了配置文件的详细解析以及Mapper的详细解析,可以看作都是静态的东西,那么这节开始我们就要看动的东西,我们就来看看 SQL 的执行过程,我们平时都会写 Mapper接口,那么这节我们先来看下我们的 Mapper 接口的代理创建过程。 2 源码分析 2.1 Mapper 接口放 阅读全文
posted @ 2023-03-06 07:20 酷酷- 阅读(62) 评论(0) 推荐(0) 编辑
摘要:1 前言 今天我们来看个问题,我看源码的时候产生的困惑,就是我们都知道SpringAOP 我们方法中调用第二个方法,第二个方法不会走增强的逻辑,而原生的 Cglib 方法互相调用是会走增强的呢?我们看下现象: 1.1 原生 Cglib 方法互相调用 public class UserServiceI 阅读全文
posted @ 2023-03-05 16:37 酷酷- 阅读(165) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们简单看了 Enhancer 的 generateClass 和 firstInstance,两个方法的内容也就是创建代理以及生成代理对象的内容,这节我们结合实际生成的文件了解一下代理的实际执行过程。 2 代理文件分析 我们看一下生成的文件有三个:代理类以及两个FastClass,那 阅读全文
posted @ 2023-03-04 20:30 酷酷- 阅读(64) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们看了 EnhancerKey 是通过KeyFactory里的 Generator来创建代理对象,这节我们就来看下 Enhancer是如何创建代理对象的。 2 源码分析 上节我们看过了,AbstractClassGenerator 是模板模式的枢纽,创建代理对象子类复写 genera 阅读全文
posted @ 2023-03-04 14:08 酷酷- 阅读(120) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们简单感受了下Cglib的一个代理过程,并且我也说到了Enhancer 创建代理的时候,首先会创建对象Key出来,用于标识这个类以及将其作为缓存的Key,然后再创建代理对象并放进缓存,那么这节我们就来看下执行的一个具体过程。 2 源码分析 2.1 Key创建的时机 首先我们先来看下是 阅读全文
posted @ 2023-03-03 21:57 酷酷- 阅读(168) 评论(0) 推荐(0) 编辑
摘要:1 前言 之前我们看过了JDK动态代理的源码了,今天我们大概花三四篇(因为一篇文章东西太多写的人费劲看的人也累哈)来看看Cglib的代理源码过程,其中涉及到asm包中的东西构建类代码什么的这里我暂时不做深入了解哈。 2 环境准备 源码下载地址:http://www.java2s.com/Code/J 阅读全文
posted @ 2023-03-03 20:13 酷酷- 阅读(57) 评论(0) 推荐(0) 编辑
摘要:1 前言 在了解数据源后,我们来看下事务管理器,这个东西也很重要。 2 事务管理器类型 在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"): JDBC – 这个配置直接使用了 JDBC 的提交和回滚功能,它依赖从数据源获得的连接来管理事务作用域。默认情 阅读全文
posted @ 2023-03-02 21:34 酷酷- 阅读(380) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们练习下,Mybatis怎么引入第三方的数据源,我们这里拿 Druid 示例。 2 引入 Druid 数据源 2.1 依赖引入 首先我们要把 Druid 的包引进来吧: <dependency> <groupId>com.alibaba</groupId> <artifactId>d 阅读全文
posted @ 2023-03-02 07:52 酷酷- 阅读(70) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们看过了连接池的管理,那么我们这节再看下非池连接的数据源的源码,这部分内容比较少,应该会很轻松,我们来看下吧。 2 源码分析 我们先来看下 UnpooledDataSource 类的基础信息: 2.1 基础信息 public class UnpooledDataSource impl 阅读全文
posted @ 2023-03-02 07:12 酷酷- 阅读(66) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们主要讲解了一些数据源的分类和概念,并简单看了三种数据源工厂的创建,那么这节我们着重看下连接池方式的管理。 2 源码分析 关于连接池的几个类我先简单说下: PooledDataSourceFactory 数据源工厂,用于创建数据源的 PooledDataSource 数据源对象,用于 阅读全文
posted @ 2023-03-01 23:51 酷酷- 阅读(149) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们要看一下数据源的东西了。比如我们以前在XML配置的什么驱动、url、账号密码啥的以及现在我们在SpringBoot下配置的其实都是为了创建我们的数据源,那么这节我们来看下数据源的基础知识和创建过程。 官方关于数据源的讲解:https://mybatis.org/mybatis-3/ 阅读全文
posted @ 2023-03-01 22:51 酷酷- 阅读(129) 评论(0) 推荐(0) 编辑
摘要:1 前言 我们大概花了7篇文章讲解了配置解析的东西,其中花了4篇是在 mappers 的解析,内容比较多,涉及的类也比较多,所以我们这节来根据类做个总结,什么阶段用的哪个类进行了什么样的处理。 2 配置文件解析的过程 首先我们要清楚一点,我们最终是要得到SqlSessionFactory,因为有了它 阅读全文
posted @ 2023-03-01 08:44 酷酷- 阅读(25) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示