- 博客(175)
- 收藏
- 关注
原创 ThreadLocal 原理
总述ThreadLocal 在面试中经常提到,关于ThreadLocal使用不当造成OOM以及在特殊场景下,通过ThreadLocal可以轻松实现一些看起来复杂的功能,都说明值得花时间研究其原理。ThreadLocal 不是 Thread,是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,对数据存储后,只有在线程中才可以获取到存储的数据,对于其他线程来说是无法获取到数据。可能...
2022-11-07 19:58:05 333
原创 ConcurrentHashMap(1.7) 相关整理
1. ConcurrentHashMapConcurrentHashMap 是线程安全且高效的 HashMap。多线程环境下,使用 HashMap 进行 put 操作会引起死循环,如下例,导致 CPU 利用率接近 100%,所以在并发情况下不能使用 HashMap。public static void main(String[] arg) throws InterruptedEx...
2022-11-07 17:48:24 523
原创 数据结构与算法经典问题解析-Java语言描述
第一章 绪论两个主定理:其时间复杂度为O(nlogn)1 问题21与问题22对比可以发现: 问题规模减小和递归求解主定理中f(n)必须要是正的方可,否则不能直接套定理,只能用数学带入法求解。2 问题34对T(n)=2T(n/2)+cn 时间复杂度的求解,参考算法导论一书根据上面求解思路可得出:T(n)=T(n-1)+T(n-2)+c的时间复杂度为O(2^n)利...
2020-09-08 20:14:00 447
原创 SpringBoot
1 将SpringBoot打成war包(1)添加Tomcat依赖,去除Tomcat<!-- 设置tomcat在打包时去除--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-t...
2020-04-16 07:48:00 97
原创 代理模式-结构型
1 模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。通过引入一个新的对象(如小图片和远程代理 对象)来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式...
2020-04-01 15:34:00 132
原创 框架面试
SpringSpring DI(IOC) 是什么?如何实现?Spring AOP是什么?使用场景?底层如何实现?项目里用到了AOP?为什么要使用aop,直接抽取方法封装起来不行吗?待定spring bean的生命周期,注入方式参考:https://www.cnblogs.com/youngao/p/12576719.htmlspringmvc执行流程Spring的事...
2020-04-01 12:49:00 111
原创 Hash算法总结
目录1 Hash函数2 Hash冲突3 一致性hashhash表1 hash函数地址index=H(key)即根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表。1.1 hash函数的性质(1)输入域是无穷的,但是输出域是有限的(2)不是随机产生的输出,相同的输入一定对应相同的输出(3)不同的输入可能会导致相同的输出(hash碰撞)(4)输...
2020-03-30 16:55:00 250
原创 集合与多线程面试
集合Java中集合和数组的区别?一、集合和数组的区别区别1:数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值。集合只能存储引用数据类型(对象)。集合也能存储基本数据类型(有点矛盾,看后句),但是在存储的时候会自动装箱变成对象。区别2:数组长度是固定的,不能自动增长。集合的长度是可变的,可以根据元素的增长而增长。二、集合和...
2020-03-30 15:27:00 325
原创 算法题目
算法题LeetCode83. 删除排序链表中的重复元素LeetCode50. Pow(x, n)LeetCode103. 二叉树的锯齿形层次遍历LeetCode138. 复制带随机指针的链表LeetCode232. 用栈实现队列LeetCode104. 二叉树的最大深度LeetCode111. 二叉树的最小深度LeetCode344. 反转字符串Leet...
2020-03-30 09:40:00 462
原创 可能是全网最好的MySQL重要知识点
什么是MySQL?MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。事务...
2020-03-27 16:27:00 333
原创 Spring MVC 原理探秘 - 容器的创建过程
1.简介在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的。Spring MVC 可对外提供服务时,说明其已经处于了就绪状态。再次之前,Spring MVC 需要进行一系列的初始化操作。正所谓兵马未动,粮草先行。这些操作包括创建容器,加载 DispatcherServlet 中用到的各种组件等。本篇文章就来和大家讨论一下这些初始化操作中的容器创建操作,容...
2020-03-27 15:18:00 96
原创 Spring MVC 原理探秘 - 一个请求的旅行过程
1.简介在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章。为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一下 Spring MVC 的一些原理。在本篇文章中,你将会了解到 Spring MVC 处理请求的过程。同时,你也会了解到 Servlet 相关的知识。以及 Spring MVC 的核心 D...
2020-03-27 15:16:00 118
原创 Spring AOP 源码分析 - 拦截器链的执行过程
1.简介本篇文章是 AOP 源码分析系列文章的最后一篇文章,在前面的两篇文章中,我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器,以及如何创建代理对象的过程。现在我们的得到了 bean 的代理对象,且通知也以合适的方式插在了目标方法的前后。接下来要做的事情,就是执行通知逻辑了。通知可能在目标方法前执行,也可能在目标方法后执行。具体的执行时机,取决于用户的配置...
2020-03-27 15:14:00 151
原创 Spring AOP 源码分析 - 创建代理对象
1.简介在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的。现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 bean 的某些方法前后。与筛选合适的通知器相比,创建代理对象的过程则要简单不少,本文所分析的源码不过100行,相对比较简单。在接下里的章节中,我将会首先向大家介绍一些背景知识,然后再去分析源...
2020-03-27 15:12:00 302
原创 Spring AOP 源码分析 - 筛选合适的通知器
1.简介从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor)。在上一篇AOP 源码分析导读一文中,我简单介绍了 AOP 中的一些术语及其对应的源码,部分术语和源码将会在本篇文章中出现。如果大家不熟悉这些术语和源码,不妨去...
2020-03-27 15:10:00 123
原创 Spring AOP 源码分析系列文章导读
1. 简介前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解。在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅读了 AOP 方面的源码。开始以为 AOP 部分的源码也会比较复杂,所以原计划投入一周的时间用于阅读源码。但在我大致理清 AOP 源码逻辑后,发现没想的那么复杂,所以目前进度算是超前了。从今...
2020-03-27 15:09:00 96
原创 Spring IOC 容器源码分析 - 余下的初始化工作
1. 简介本篇文章是“Spring IOC 容器源码分析”系列文章的最后一篇文章,本篇文章所分析的对象是 initializeBean 方法,该方法用于对已完成属性填充的 bean 做最后的初始化工作。相较于之前几篇文章所分析的源码,initializeBean 的源码相对比较简单,大家可以愉快的阅读。好了,其他的不多说了,我们直入主题吧。2. 源码分析本章我们来分析一下 in...
2020-03-27 11:28:00 138
原创 Spring IOC 容器源码分析 - 填充属性到 bean 原始对象
1. 简介本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的。我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反射创建一个原始的 bean 对象,然后再向这个原始的 bean 对象中填充属性。对于填充属性这个过程,简单点来说,JavaBean 的每个属性通常都有 getter/setter 方法,我们...
2020-03-27 11:13:00 132
原创 Spring IOC 容器源码分析 - 循环依赖的解决办法
1. 简介本文,我们来看一下 Spring 是如何解决循环依赖问题的。在本篇文章中,我会首先向大家介绍一下什么是循环依赖。然后,进入源码分析阶段。为了更好的说明 Spring 解决循环依赖的办法,我将会从获取 bean 的方法getBean(String)开始,把整个调用过程梳理一遍。梳理完后,再来详细分析源码。通过这几步的讲解,希望让大家能够弄懂什么是循环依赖,以及如何解循环依赖。...
2020-03-27 11:12:00 119
原创 Spring IOC 容器源码分析 - 创建原始 bean 对象
1. 简介本篇文章是上一篇文章(创建单例 bean 的过程)的延续。在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程。本篇文章,我们就从战术的层面上,详细分析doCreateBean方法中的一个重要的调用,即createBeanInstance方法。在本篇文章中,你将看到三种不同的构造 bean 对象的方式。你也会了解到构造 bean 对象的两种策略。如果你对...
2020-03-27 11:08:00 94
原创 Spring IOC 容器源码分析 - 创建单例 bean 的过程
1. 简介在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑。对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去创建,而是从缓存中获取。如果某个 bean 还未实例化,这个时候就无法命中缓存。此时,就要根据 bean 的配置信息去创建这个 bean 了。相较于getBean(String)方法的实现逻...
2020-03-26 20:40:00 130
原创 Spring IOC 容器源码分析 - 获取单例 bean
1. 简介为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章。在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一些建议。在做完必要的准备工作后,从本文开始,正式开始进入源码分析的阶段。在本篇文章中,我将会详细分析BeanFactory的getBean(String)方法实现细节,getBean(St...
2020-03-26 19:41:00 154
原创 Spring IOC 容器源码分析系列文章导读
1. 简介Spring 是一个轻量级的企业级应用开发框架,于 2004 年由Rod Johnson发布了 1.0 版本。经过十几年的迭代,现在的 Spring 框架已经非常成熟了。Spring 包含了众多模块,包括但不限于 Core、Bean、Context、AOP 和 Web 等。在今天,我们完全可以使用 Spring 所提供的一站式解决方案开发出我们所需要的应用。作为 Java...
2020-03-26 19:40:00 112
原创 Spring bean的生命流程
Spring 是一个轻量级的 J2EE 开源框架,其目标是降低企业级应用开发难度,提高企业级应用开发效率。在日程开发中,我们会经常使用 Spring 框架去构建应用。所以作为一个经常使用的框架,了解其原理还是很有必要的。接下来我们就从宏观层面上,来看看 Spring 中的 bean 由实例化到销毁的过程。在详细讨论 bean 生命周期前,先上一张图,后面也会围绕这张图展开讨论。图1...
2020-03-26 19:27:00 68
原创 自己动手实现的 Spring IOC 和 AOP - 下篇
1. 背景本文承接上文,来继续说说 IOC 和 AOP 的仿写。在上文中,我实现了一个很简单的 IOC 和 AOP 容器。上文实现的 IOC 和 AOP 功能很单一,且 IOC 和 AOP 两个模块没有整合到一起。IOC 在加载 bean 过程中,AOP 不能对 bean 织入通知。在本文中,我们详细说一下升级版 IOC 和 AOP。这个版本的实现包含了在上篇中所说的功能,这里再重述...
2020-03-26 19:26:00 72
原创 自己动手实现的 Spring IOC 和 AOP - 上篇
1. 背景我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了。不过之前没有仿写过 Spring IOC 和 AOP,只是宏观上对 Spring IOC 和 AOP 原理有一定的认识。所以为了更进一步理解 Spring IOC 和 AOP 原理。在工作之余,参考了一些资料和代码,动手实现了一个简单的 IOC 和...
2020-03-26 19:25:00 174
原创 Java 序列化和反序列化相关整理
1. 概述Java 提供了一种对象序列化的机制,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。把对象转换为字节序列的过程称为对象的 序列化。将序列化对象写入文件后,可以从文件中读取出来,并且对它进行反序列化,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。把字节序列恢复为对象的过程称为对象的 ...
2020-03-26 19:01:00 215
原创 Java 反射相关整理
1. Class 类Class 是一个类,封装了当前对象所对应的类的信息,一个类中有属性,方法,构造器等。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。Class 对象只能由系统建立对象,一个类(而不是一个对象)在 Java 虚拟机中只会有一个 Class 实例。Class 对象的由来是将 class...
2020-03-26 18:46:00 145
原创 Java 泛型相关整理
1. 概述Java 泛型(generics)是 JDK 5 中引入的一个新特性,泛型提供了 编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型,即 参数化类型。将类型由原来的具体的类型(类似于方法的变量参数,该变量定义了具体的类型),也定义成参数形式(可以称之为类型形参),然后在使用/调用时再传入具体的类型(类型实参)。泛型的本质是为了参数化类型(在不创建新...
2020-03-26 18:34:00 105
原创 Java 动态代理实现
JDK 动态代理代理模式是常用的 JAVA 设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 JDK 动态代理是 java.lang....
2020-03-26 14:50:00 58
原创 JUC总览
基础知识:线程:https://www.cnblogs.com/youngao/p/12568580.html并发基础:https://www.cnblogs.com/youngao/p/12558381.htmlCAS:https://www.cnblogs.com/youngao/p/12520260.htmlUnsafe类:https://www.cnblogs.com/...
2020-03-26 14:10:00 137
原创 7 种阻塞队列相关整理
1. 简介阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。两个附加的操作。支持阻塞的 插入 方法,在队列为空时,获取元素的线程会等待队列变为非空。支持阻塞的 移除 方法,当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而...
2020-03-26 13:56:00 265
原创 Exchanger 相关整理
1. 简介Exchanger(交换者)是自 JDK 1.5 起开始提供的工具套件,源于 java.util.concurrent 包。是一个用于线程间协作的工具类。Exchanger 用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。此类提供对外的操作是同步的。用于 成对 出现的线程之间交换数据。可以视作双向的同步队列。可应用于基...
2020-03-26 13:40:00 221
原创 Semaphore 相关整理
1. 简介Semaphore 类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或逻辑的)线程数目。一个信号量有且仅有 3 种操作,且它们全部是原子的。初始化、增加和减少。增加可以为一个进程解除阻塞。减少可以让一个进程进入阻塞。Semaphore 管理一系列许可证。每个 acquire() 方法阻塞,直到有一个许可证可以获得然后拿...
2020-03-26 13:38:00 96
原创 ConcurrentLinkedQueue 相关整理
1. ConcurrentLinkedQueue在并发编程中有时候需要使用线程安全的队列,线程安全队列有两种实现方式。阻塞方式:对入队和出队操作加锁,阻塞队列。非阻塞方式:通过自旋 CAS 实现,例如:ConcurrentLinkedQueue。在中等规模的并发场景下,ConcurrentLinkedQueue 性能会高出不少,而且相当稳定。Concurren...
2020-03-26 13:36:00 144
原创 ConcurrentHashMap(1.8) 相关整理
1. ConcurrentHashMap1.1 HaspMap(JDK 1.8)JDK 1.8 HashMapJDK 1.8 对 HashMap 进行了修改,最大的不同就是利用了红黑树,其由数组+链表+红黑树组成。JDK 1.7 中,查找元素时,根据 hash 值能够快速定位到数组的具体下标,但之后需要顺着链表依次比较才能查找到需要的元素,时间复杂度取决于链表的长...
2020-03-26 13:33:00 71
原创 ReentrantReadWriteLock 相关整理
1. ReentrantReadWriteLock 概述ReentrantReadWriteLock 是 Lock 的另一种实现方式,ReentrantLock 是一个排他锁,同一时间只允许一个线程访问,而 ReentrantReadWriteLock 允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况...
2020-03-26 13:06:00 68
原创 LockSupport 工具相关整理
1. LockSupportLockSupport 是用来创建锁和其他同步类的基本线程阻塞原语。是一个简单的代理类,里面的代码都是使用 Unsafe 类里面的方法。JDK 对 LockSupport 的描述:Basic thread blocking primitives for creating locks and other synchronization classes...
2020-03-26 11:51:00 52
原创 Lock 相关整理
锁是用来控制多个线程访问共享资源的方式。Java 程序可以使用 syschronized 关键字实现锁功能,而 Java 5 之后,在并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能。Lock 提供了与 syschronized 关键字类似的同步功能,只是在使用时需要 显式地获取和释放锁。虽然缺少了 syschronized 关键字的隐式获取释放锁的便捷性(锁获取...
2020-03-26 11:50:00 68
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人