wangxiaoming
博客是很好的总结和记录工具,如果有问题,来不及回复,关注程序员奇点,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
展开
-
SpringBoot 是如何创建 Bean 的
这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战Spring源码中我已经知道的两种上下文: ClassPathXmlApplicationContext、AnnotationConfigApplicationContext我们知道 Spring 启动的核心过程是通过 ApplicationContext#refresh 方法,加载 BeanDefinition 在 obtainFreshBeanFactory 方法中实现。那么 SpringBoot 是在什么时候加载 BeanDefiniti原创 2022-06-04 11:28:15 · 734 阅读 · 1 评论 -
ThreadLocal理解
ThreadLocal 实现原理参考资料https://www.cnblogs.com/dolphin0520/p/3920407.html原创 2022-01-24 22:39:03 · 102 阅读 · 0 评论 -
Spring 是如何解决循环依赖的?
Spring 是如何解决循环依赖的?循环依赖:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传Spring 循环依赖有三种情况:构造器的循环依赖,这种依赖 Spring 无法处理,直接抛出 BeanCurrentlyInCreationException 异常单例模式下的 setter 循环依赖,可以通过三级缓存处理非单例循环依赖,无法处理,BeanCurrentlyInCreationException 异常构造器循环依赖正要创建的 bean 记录在缓存中,Spr原创 2020-08-13 00:35:43 · 854 阅读 · 0 评论 -
Java8 HashMap 源码分析
Java8 HashMap 源码分析JDK 1.6 1.7 HashMap 采用的是 数组+链表的形式, 每个桶对应不同的 hash 值,根据 key 计算得到的 hash,将键值对存放到对于的位置。hashMap 的键值都可以为 null ,每个桶又是链表的形式是存放的。但是当一个桶中链表的元素变多,通过 key 值依次查找的效率会变低,因此 HashMap 采用的是 桶+链表/红黑树的方式实现。 当链表长度超过 8 时,将链表转换为红黑树,大大减少查找时间。HashMap 结构底层实现Ha原创 2020-10-08 14:21:39 · 293 阅读 · 0 评论 -
Java ArrayList 源码
Java ArrayList 源码ArrayList 概述ArrayList 是基于数组实现,是一个动态数组,容量可以自动增长,动态增加内存。ArrayList 不是线程安全的,只能用在单线程,多线程换成环境下可以考虑 Collections.synchronizedList(List l) 函数返回一个线程安全的 ArrayList 类,也可以在 concurrent 并发包下的 CopyOnWriteArrayList 类。ArrayList 实现了Serializable 接口,支持序列化传输原创 2020-10-04 21:01:43 · 341 阅读 · 0 评论 -
Java String 源码分析
Java String 源码分析定义Java 8 中 String 源码public final class String implements java.io.Serializable, Comparable<String>, CharSequence {...}String 是final 类型不能被继承,同时实现了 java.io.serializable Comparable charSequence 三个接口。String类 官方的说法是:String 字符串常量原创 2020-10-02 12:43:13 · 268 阅读 · 0 评论 -
Java 中 Hashtable 、HashMap 、TreeMap 有什么不同?
Java 中 Hashtable 、HashMap 、TreeMap 有什么不同?HashTable 最早期的 Java 类库提供的一个 Hash表实现,本身是同步的,不支持 null 键和值,对同步有导致性能开销,很少被推荐使用。HashMap 是应该更加广泛的哈希表实现,行为上与 hashtable 一致,主要区别是 Hashmap 不是同步的,支持null 建和值。 HashMap 进行 put 或者 get 操作,可以达到常熟时间的性能,所以绝大多数场景都使用 HashMap。TreeMap原创 2020-07-05 16:00:16 · 516 阅读 · 0 评论 -
Java 异常处理机制
Java 异常处理机制Exception 和 Error 有什么区别?Exception 和Error 都是继承 Throwable 类,在 java 只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。Exception 和 Error 提现了 Java 平台设计者不同异常情况的类,Exception 在程序运行中,可预料的意外情况,并且可能被捕获,进行相应处理。Error 是指在正常情况下,不大可能出现的情况,可能是因为JVM自原创 2020-06-26 22:46:28 · 189 阅读 · 0 评论 -
如何动态生成一个Java类
如何动态生成一个Java类开发者编写Java 代码,调用 javac 编译生成 class 文件。然后通过类加载机制载入 JVM ,即成为了应用可以使用的 Java 类。可以写一个编译类编译 java 代码:import java.io.File;import java.io.FileWriter;import java.lang.reflect.Method;import javax.tools.JavaCompiler;import javax.tools.JavaCompiler.Co原创 2020-06-23 22:57:27 · 1513 阅读 · 0 评论 -
接口和抽象有什么区别?
接口和抽象有什么区别?接口和抽象是 Java 面向对象设计的两个基础机制。接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到API 定义和实现分离的目的。接口不能实例化,接口不能包含任何非常量成员,任何 field 隐含 public field final的意义非静态方式实现,要么是抽象方法,要么是静态方法。抽象类不能实例化,用 abstract 关键字修饰 class, 其主要目的是代码重用。抽象类和普通 Java 类在形式上没有太大区别。 可以有一个或者多个抽象方法,- 抽象原创 2020-06-21 00:49:45 · 358 阅读 · 0 评论 -
【深入理解Java原理】final 、finally finalize 有什么不同?
final 、finally finalize 有什么不同?final 可以用来修饰类、方法、变量。final 修饰的 class 代表不可以继承扩展,final 修饰的方法标识不能被重写(override),final 修饰的方法表示不可以修改。finally 则是 Java 保证重点代码一定要被执行的一种机制,我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC连接、保证 unlock锁等动作finalize 则是基础类 java.lang.Object原创 2020-05-08 23:11:20 · 249 阅读 · 0 评论 -
【深入理解JVM 原理】什么情况下Java程序会产生死锁?如何定位、修复?
什么情况下Java程序会产生死锁?如何定位、修复?死锁死锁只一种特定的程序状态,在实体之间,由于循环依赖导致一直处于等待之中,没有任何个体可以继续前进,死锁不仅仅是线程之间会发生,存在独占的进程之间同样也可能出现死锁,通常来说,我们大多数聚集在多线程场景中的死锁,指的是两个或者多个线程之间,由于相互等待需要对方需要的锁,而永久阻塞的状态。产生死锁的四个必要条件:互斥条件:一个资源每次只能...原创 2020-05-05 15:47:55 · 478 阅读 · 0 评论 -
【深入理解Java原理】如何保证容器是线程安全的? ConcurrentHashMap 如何高效的线程安全?
如何保证容器是线程安全的? ConcurrentHashMap 如何高效的线程安全?Java提供了不同层面的线程安全支持。在传统集合框架内部,除了 Hashtable等同步容器,还提供了所谓的同步包装器(Synchronized Wrapper),我们可以调用Collections工具类提供的包装方法,来获取一个同步的包装容器(如 Collections.synchronizedMap),但是它们都是利用非常粗粒度的同步方式,在高并发情况下,性能比较低下。其实可以利用并发包提供的线程安全容器。各种并发原创 2020-05-10 14:23:38 · 484 阅读 · 0 评论 -
【深入理解Java原理】AtomicInteger 底层实现原理是什么? 如何在自己代码中应用 CAS 操作?
AtomicInteger 底层实现原理是什么? 如何在自己代码中应用 CAS 操作AtomicInteger 是对 int 类型的一个封装,提供原子性的访问和更新操作,其原子性的操作实现是基于 CAS (compare-and-swap)技术。https://en.wikipedia.org/wiki/Compare-and-swapCAS,表征的是一些列操作的集合,获取当前数值,进行一些运算,利用 CAS 指令试图进行更新,如果当前数值不变,代码没有其他线程进行并发修改,则成功更新。否则,可能原创 2020-05-11 19:02:28 · 673 阅读 · 1 评论 -
【深入理解Java原理】Java 内存模型中的 happen-before 是什么?
Java 内存模型中的 happen-before 是什么?Happen-before 关系,是Java 内存模型中保证多线程可见性的机制,也是早期语言规范中含糊可见性概念的一个精确定义。它的具体表现形式,包括但远不止 synchronized,volatile,lock 操作顺序等方面。happen-before 原则程序顺序规则:一个线程内执行的每个操作,都保证 happen-before 后面的操作,这样就保证了程序顺序规则,volatile 变量规则:对于 volatile 变量,对他原创 2020-05-13 12:41:21 · 692 阅读 · 0 评论 -
【深入理解Java原理】JAVA SPI 是怎么实现的?
JAVA SPI 是怎么实现的?SPI 是什么?SPI(Service Provider Interface) ,是 JDK 内置的一种提供发现机制。SPI 是一种动态替换发现的机制。JAVA SPI 实现定义一组接口,接口有多种实现public interface IShout { void shout();}public class Cat implements IShout { @Override public void shout() {原创 2020-06-02 19:04:55 · 613 阅读 · 0 评论 -
【深入理解Java原理】对比Vector、 ArrayList、 LinkedList有何区别?
对比Vector、 ArrayList、 LinkedList有何区别?这三者都是实现集合框架中的List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提倛迭代器以遍历其內容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。Vector 是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,同步有额外开销,Vector 内部是使用对象数组保存数据,也可以根据需要自动增加容量,当数组已满时,会创建新的数组,原创 2020-05-15 00:01:54 · 525 阅读 · 0 评论 -
【深入理解Java原理】String StringBuffer,StringBuilder 原理
String StringBuffer,StringBuilder 原理String,StringBuffer,StringBuilder 是经常使用的,了解其原理十分重要查看String源码public final class String implements java.io.Serializable...原创 2019-07-25 11:26:27 · 611 阅读 · 0 评论 -
【深入理解Java原理】Java 动态代理的理解与Cglib动态代理实现
Java 动态代理的理解与Cglib动态代理实现什么是动态代理?先说下静态代理: 也即是说,在程序运行前,已经有了编译好的类,这个就是静态代理,动态代理: 也即,在程序运行前, 代理类并不存在,而是在程序运行时,动态生成的类是动态代理类。可能会有如下思考代理模式是怎样的?用什么技术实现?为什么要使用代理模式呢?有什么好处?动态代理...原创 2019-07-25 10:36:27 · 707 阅读 · 1 评论 -
【深入理解Java原理】Java类加载机制
Java类加载机制本文章完整内容已经发布在微信公众号:程序员开发者社区,欢迎关注,后台回复: 资源 ,有惊喜所谓类加载机制是指 Java 虚拟机如何加载class文件?类加载机制虚拟机将类的数据从Class文件加载到内存,并对数据进行校验,转换解析,和初始化最终形成Java虚拟机可以使用的Java类型...原创 2019-07-25 10:21:02 · 1847 阅读 · 0 评论 -
【深入理解Java原理】Iterator 原理
Iterator 原理ArrayList中iteraor 使用 ArrayList<String> list = new ArrayList<String>(); list.add("hello"); list.add("world"...原创 2019-07-13 10:13:09 · 359 阅读 · 0 评论 -
【深入理解Java原理】线程池原理
合理的使用线程池有几个好处第一: 降低资源消耗,通过线程的重复利用,可以降低 线程创建和销毁的消耗第二:提高响应速度,任务来时,不用新建线程就能执行第三: 能够进行线程的管理,线程不能无限制的创建,是稀缺资源。线程池原理?1. 判断当前工作线程的个数是否大于核心线程数目,如果不是,那么就新建一个线程来执行任务,如果是,则进入2流程2.线程池判断工作线程已经到达核...原创 2019-07-25 10:21:31 · 228 阅读 · 0 评论 -
【深入理解Java原理】Synchronized原理
多线程共享内存,需要解决两个问题:竞态条件 内存可见性可以使用Synchronized 解决上面的问题从几个方面来理解synchronized可重入性 内存可见性 死锁可重入性是synchronized 一个特点,原理如下:可重入锁是记录锁的持有线程,和持有数量来实现的,当被synchronized 保护的代码时 ,检查对象是否已经被锁,如果是,那么检查是否被当前...原创 2019-07-25 10:23:33 · 1463 阅读 · 2 评论 -
【深入理解Java原理】HashMap源码解读 JDK7/8
HashMap 原理先看下总体架构java.util.Map 接口数据结构 JDK 8 和JDK 7 的区别1.为了加快查询效率,java8的hashmap引入了红黑树结构,当数组长度大于默认阈值64时,且当某一链表的元素>8时,该链表就会转成红黑树...原创 2019-07-25 10:34:19 · 442 阅读 · 0 评论