- 博客(12)
- 收藏
- 关注
原创 ThreadLocal原理及内存泄漏模拟
ThreadLocal原理 ThreadLocal是Java中所提供的线程本地存储机制,可以利⽤该机制将数据缓存在某个线程内部,成为线程内的局部变量 该线程可以在任意时刻、任意⽅法中获取缓存的数据 这样每个线程都自己管理自己的局部变量,别的线程操作的数据不会产生影响,互不影响 一般使用ThreadLocal,官方建议定义为private static ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象(注意不是ThreadLocal对 象)中都存在⼀个ThreadL
2021-09-29 18:14:14
391
1
原创 自定义线程池
自定义线程池 前言 线程池是由线程 + 队列形成的 创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限 为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程 因此,我们可以根据以上要求,创建出自己的线程池 阻塞双端队列 利用阻塞队列来存放 暂时 无法处理的 任务 public class MyBlockingQueue<T> { private Deque<T> q
2021-08-09 13:47:19
125
原创 Spring 循环依赖与三级缓存
Spring 循环依赖与三级缓存 循环依赖 循环依赖为Spring 初始化bean时可能遇到的问题 如:A依赖A;A依赖B,B依赖A等 主要场景 /** 属性填充时产生的 循环依赖 spring能够自动解决 **/ @Component public class AService { @Autowired private BService bService; } @Component public class BService { @Autowired priva
2021-07-27 20:27:53
198
原创 Spring Bean 生命周期
Spring Bean 生命周期 bean 生命周期 执行流程 推断构造方法(实例化) 实例化时,会根据构造方法 参数的 byType、byName去寻找单例bean 当只有一个构造方法时 可以是无参构造 可以是有参构造,根据byType寻找单例bean 当找到的单例bean有多个时,判断是否有和byName相同的bean对象,有则使用,没有则报错(不知道选哪个bean) 当找到的单例bean只有一个时,无论byName是否相同,直接使用该bean对象 当有多个构造方法时 判
2021-07-27 20:11:35
146
原创 AQS详解与实现
AQS基本原理 AQS:全称 AbstractQueuedSynchronizer 位于java.util.concurrent.locks包下,是阻塞式锁和相关的同步器工具的框架 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取 锁和释放锁 /** 用 state 属性来表示资源的状态(分独占模式和共享模式) 独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源 **/ private volatile int state;
2021-07-18 20:05:44
478
原创 设计模式之单例设计模式
单例设计模式 单例设计模式的种类很多,也都有自己的优缺点和应用场景,这里只记录常用的几种单例设计模式 饿汉式 public class Singleton{ // 类内部实例化 private final static Singleton instance = new Singleton(); // 构造器私有化,防止new对象 private Singleton(){ } // 对外提供公有方法调用 public static Singleton getInstance(){ ret
2021-07-13 01:06:59
93
原创 Java设计模式之代理模式
概述 代理模式是常用的java设计模式 他的特征是代理类与委托类有同样的接口 代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途 静态代理 静态代理:由程序员创建或
2021-05-26 12:19:34
106
原创 JAVA基础之反射
反射 概述 反射机制 JAVA反射机制是在 运行状态中 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性 在反射中,可以把方法视为对象(万物皆对象) 传统方法:对象.方法() 反射机制:方法.invoke(对象) 反射提供的功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任意一个对象的成员变量和方法 生成动态代理 反射的优缺点 优点:可以动态的创建和使用对象,使用灵活
2021-05-25 22:53:58
107
原创 JUC源码之ConcurrentHashMap
JDK7 HashMap并发死链问题 HashMap是线程不安全的,在JDK7版本,甚至有可能造成严重后果的并发死链问题 产生原因 没有对代码进行同步性保护 采用头插法形成链表 多线程并发执行put() 源码分析 这里只分析 与问题相关的 扩容相关 源码 /** * 源码分析:resize(2 * table.length) * 作用:当容量不足时(容量 > 阈值),则扩容(扩到2倍) */ void resize(int newCapacity) {
2021-05-19 16:56:23
202
2
原创 Collection源码之HashMap
HashMap源码 本文源码基于JDK8 成员变量 // 默认初始化容量 为 16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 最大容量 static final int MAXIMUM_CAPACITY = 1 << 30; // 默认加载因子 /** 关于加载因子: 衡量 map 满的程度 在判断是否需要扩容时,不是根据 实际容量进行判断 而是根据 容量 * 加载因子 得出的临界值进行判断 */
2021-05-18 22:49:20
210
原创 Collection源码之ArrayList
为什么要看源码 很多人一提到ArrayList就知道它底层是数组实现的,通过网上搜索也能了解到很多相关的结论,但其实大多数人都没有实际自己动手去看源码,但往往真正自己去看源码,能够理解得更深刻,因此需要对其底层源码进行剖析。 ArrayList源码 本文源码基于JDK8 成员变量 首先 先看 ArrayList几个重要的成员变量 // 在初始化时,如果没有指定容量大小,则第一次扩容时为该容量 private static final int DEFAULT_CAPACITY = 10; // 当初始
2021-05-17 22:07:42
100
原创 Java AtomicInteger的实现
Java 原子类的实现前言一、乐观锁与CAS二、实现原子类1.分析源码2.Unsafe类3.封装一个类,获取Unsafe实例4.实现MyAtomicInteger类总结 前言 juc.atomic 包下面的原子变量使用了乐观锁的一种 CAS 实现方式,了解其原理后,便可以模拟出Java原子类的实现 一、乐观锁与CAS 乐观锁 乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测 如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做 乐观锁适用于读.
2021-04-08 21:59:07
219
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人