- 博客(18)
- 资源 (1)
- 收藏
- 关注
原创 Java类加载器-学习笔记
但是对于 SPI 来说,有些接口是 Java 核心库提供的,而 Java 核心库是由启动类加载器来加载的,而这些接口的实现却来自于不同的jar包(厂商提供),Java 的启动类加载器是不会加载其他来源的 jar 包,这样传统的双亲委托模型就无法满足 SPI 的要求。当 Java 程序请求加载器 loader1 加载 Sample 类时,loader1 首先委托自己的父加载器去加载 Sample 类,若父加载器能加载,则由父加载器完成加载任务,否则才由 loader1 本身加载 Sample 类。
2024-04-18 16:54:44
530
原创 Java中的SPI机制
Java SPI(Service Provider Interface)是 Java 平台中的一种机制,用于实现模块化、可插拔的架构。它允许开发人员定义服务接口,并通过特定的配置文件,让不同的实现者提供其实现。这种方式使得应用程序能够在运行时动态地发现和加载服务实现,而无需在编译时确定具体的实现类。
2024-04-18 16:49:10
931
原创 快速排序算法的三种实现
1.普通快速排序快速排序思路:随机取一个标定点 v,将 v 放置到合适的位置,保证 v 左边的元素都小于等于 v,v 右边的元素都大于 v,然后再继续分别对左边元素和右边的元素做同样的排序动作,直到整个数组有序。那么怎么实现这个快速排序呢,其实也很简单,我们每次取数组的第一个元素为 v,然后从 v 后面的第一元素开始遍历数组(j) ,如果当前元素小于等于 v,则交换当前元素和 j 位置的元素,并且 j++,如果当前元素大于 v,则直接遍历下一个元素就好。遍历完整个数据后,我们再将 v 和 j -1位置
2021-12-31 11:53:34
1632
原创 教你看懂Git的Graph图
前言在我们常见的Git客户端(Sourcetree、TortoiseGit等)都会展示Git的Graph图,类似于下图。不知道大家是不是跟我一样,虽然使用Git多年了,但是看不太懂Git的Graph图。最近阅读了下《Pro Git》这本书,对Git的理解又深入了一步。其实只要理解了Git的原理,看懂Graph图就很简单了。下面我会分别向大家介绍Git中重要的两个概念:Git提交对象和Git分支。Git提交对象Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。在进行提交操作时,G
2021-12-16 19:51:45
17769
2
原创 记录一次针对log4j的jndi注入攻击
事件经过今天一到公司就被钉钉监控报警群@了,报错类型如下图所示:com.mysql.jdbc.MysqlDataTruncation:Data truncation:Data too long for column这个错误很常见,就是插入数据到数据库中,字段长度超过了数据库限制的长度。于是我就去skywalking上找日志,看到底是什么参数超过了长度限制,于是我找到了报错的链路看到了网关打印的日志信息如下:重点看我红线框出的部分,这一看就不是一个正常的传参,看起来像是某种攻击。由此让我联想到,
2021-12-16 19:47:46
3667
1
原创 Java中HashMap死循环分析
JDK1.7中的HashMap在并发场景下,会出现死循环的情况。我面试的时候发现很多候选者都知道死循环的情况,但是很少有人能把这个情况说清楚。今天有空来详细分析下死循环是如何出现的。HashMap的结构首先,我们简单回顾下HashMap这个数据结构。在JDK1.7中HashMap是由数组加单链表组成的,当一个Key被加入HashMap的时候,首先会计算该Key的Hash值然后计算出应该被放入的数组下标。通过这样的方式来分散所有的Key,来提高查询效率。如果有两个Key同时分配到了同一个下边,这种情况叫H
2021-05-10 18:49:43
765
原创 ThreadLocal的介绍及原理分析
ThreadLocal的介绍及原理分析在Java服务端程序实际的开发过程中,当一个用户发起一个请求调用,我们希望在这个请求调用的所有方法中,都能很容易的获取这个用户的基本信息(userId、userName等)。一种最直接的方法就是,在每个方法的参数里面都添加上用户基本信息字段,这种方法虽然能实现,但是太繁琐,我们一般不这么使用。因为Java为我们提供了更好的实现方式,那就是ThreadLocal。接下来我将简单的介绍Threadlocal的使用方法和原理分析。是什么ThreadLocal是一个JDK
2021-04-11 21:54:00
171
原创 Java中的CAS分析
1. 概念CAS全称是 Compare And Swap,是一种在多线程环境下无锁的同步机制。CAS操作中有三个操作数:当前值,期望值,新值。只有期望值与当前值相等时,才会设置新值,否则不做任何操作。整个比较和交换的过程是原子的。2. 使用方式下面通过一个例子来说明CAS是如何保证线程安全的。假设有一个共享变量 value,我们想要给 value 值加1,一般有如下三个操作步骤:从内存中获取value值;value = value + 1;value 值写回内存;如果不加任何同步机制,在多
2021-03-10 21:37:33
491
原创 Java内存模型-学习笔记
1. JMM介绍JMM(Java Memory Model)就是Java内存模型。Java内存模型是一个抽象的概念,它描述了一组规则或规范,用来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java内存模型规定了所有的变量(包含实例字段、静态字段和构成数组对象的元素,但不包含局部变量和方法参数)都存储在主内存中。每个线程都有自己的工作内存,线程的工作内存中保存了该线程需要使用的变量的主内存副本,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行
2021-03-10 21:29:33
125
1
原创 Sping AOP之代理模式
代理模式代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式又分为静态代理和动态代理静态代理动态代理JDK动态代理CGLIB动态代理工厂模式委派模式策略模式单例模式模板方法...
2020-03-24 14:54:59
140
原创 Spring IOC 容器源码分析 02 - IOC 容器启动过程分析
1. 简介前面一篇文章,分析了 Spring IOC 容器的一些特性。从这篇文章开始,我们会开始进入源码的分析阶段。本篇文章会带大家先俯瞰 IOC 容器启动的整个过程,让读者先从整体上对 IOC 容器有个大体的认识。后面的文章,我会对容器启动过程中关键的点,进行深入的分析。好了,废话少说,下面开始看源码。2. BeanFactory 和 ApplicationContext在开始阅读源码之...
2020-03-24 14:52:52
208
原创 Spring IOC 容器源码分析 01 - IOC 容器特性介绍
1. 简介对于一个 Java 开发人员来说,Spring 框架是再熟悉不过的了。但我们很多时候都只停留在会使用的层面,或者能大概说出 IOC 的原理,但是对具体的实现细节不是很清楚。对于一个我们经常打交道的框架,还是很有必要搞清楚其中的原理。另外,本系类的源码分析文章源码是基于 Spring 4.3.17.RELEASE 版本编写的。本系列文章是对 Spring 源码的分析,适合使用过 Spr...
2020-03-24 14:52:29
204
原创 Java中为什么不能创建泛型数组
首先我们来看一个简单的例子Integer[] intArr = new Integer[1];Object[] objArr = intArr;objArr[0] = "xxx";上面的这段代码是可以正常编译的,但在运行这段代码的时候会报异常java.lang.ArrayStoreException这是因为数组在创建的时候就确定了元素的类型,并且会记住该类型,每次向数组中添加值的时候,...
2019-04-23 17:24:07
595
原创 Java泛型中的通配符<?>,<? extends T>,<? super T>
之前一直对Java泛型中的通配符不是很清楚,前几天专门研究了一下。Java中的泛型通配符分为以下三种:<? extends T> 子类型限定通配符<? super T> 超类型限定通配符<?> 无限定通配符通配符的使用场景通配符只有在修饰一个变量或参数的时候会用到,在定义泛型类或泛型方法的时候是不能使用通配符的。为了更好的说明泛型通配符的使用,...
2019-04-23 17:20:12
1812
原创 Java泛型中的桥方法(Bridge Method)
前几天在看 Java 泛型的时候,发现了一个有趣的现象。就是在某些情况下,编译器在编译我们的类文件的时候会帮我们自动生成某些方法,称作桥方法。我们知道 Java 中的泛型在编译为 class 的时候会把泛型擦除,也就是说你写的 到最后 class 文件中其实都是 Object,看下面代码示例:public class A<T> { private T value; ...
2019-04-22 11:02:19
2211
9
原创 Java8新特性一览
一、优化点HashMap当单链表数量大于8时转为红黑树ConcurrentHashMap去掉了分段锁的设计,改为使用CAS实现取消了JVM内存中的方法区,使用元空间替代(Matespace),使用直接内存二、Lambad表达式可以将一个方法作为参数进行传递,可以理解为匿名内部类的语法糖基本语法:() -> {}左侧:Lambad表达式的参数列表右侧:Lambad表达式...
2019-04-22 10:38:55
337
vue-cli demo
2018-10-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人