
Java
文章平均质量分 92
程序员大兵
记录,分享,变得更好
展开
-
Java中HashMap死循环分析
JDK1.7中的HashMap在并发场景下,会出现死循环的情况。我面试的时候发现很多候选者都知道死循环的情况,但是很少有人能把这个情况说清楚。今天有空来详细分析下死循环是如何出现的。HashMap的结构首先,我们简单回顾下HashMap这个数据结构。在JDK1.7中HashMap是由数组加单链表组成的,当一个Key被加入HashMap的时候,首先会计算该Key的Hash值然后计算出应该被放入的数组下标。通过这样的方式来分散所有的Key,来提高查询效率。如果有两个Key同时分配到了同一个下边,这种情况叫H原创 2021-05-10 18:49:43 · 783 阅读 · 0 评论 -
ThreadLocal的介绍及原理分析
ThreadLocal的介绍及原理分析在Java服务端程序实际的开发过程中,当一个用户发起一个请求调用,我们希望在这个请求调用的所有方法中,都能很容易的获取这个用户的基本信息(userId、userName等)。一种最直接的方法就是,在每个方法的参数里面都添加上用户基本信息字段,这种方法虽然能实现,但是太繁琐,我们一般不这么使用。因为Java为我们提供了更好的实现方式,那就是ThreadLocal。接下来我将简单的介绍Threadlocal的使用方法和原理分析。是什么ThreadLocal是一个JDK原创 2021-04-11 21:54:00 · 173 阅读 · 0 评论 -
Java中的CAS分析
1. 概念CAS全称是 Compare And Swap,是一种在多线程环境下无锁的同步机制。CAS操作中有三个操作数:当前值,期望值,新值。只有期望值与当前值相等时,才会设置新值,否则不做任何操作。整个比较和交换的过程是原子的。2. 使用方式下面通过一个例子来说明CAS是如何保证线程安全的。假设有一个共享变量 value,我们想要给 value 值加1,一般有如下三个操作步骤:从内存中获取value值;value = value + 1;value 值写回内存;如果不加任何同步机制,在多原创 2021-03-10 21:37:33 · 497 阅读 · 0 评论 -
Java内存模型-学习笔记
1. JMM介绍JMM(Java Memory Model)就是Java内存模型。Java内存模型是一个抽象的概念,它描述了一组规则或规范,用来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java内存模型规定了所有的变量(包含实例字段、静态字段和构成数组对象的元素,但不包含局部变量和方法参数)都存储在主内存中。每个线程都有自己的工作内存,线程的工作内存中保存了该线程需要使用的变量的主内存副本,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行原创 2021-03-10 21:29:33 · 127 阅读 · 1 评论 -
Sping AOP之代理模式
代理模式代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式又分为静态代理和动态代理静态代理动态代理JDK动态代理CGLIB动态代理工厂模式委派模式策略模式单例模式模板方法...原创 2020-03-24 14:54:59 · 145 阅读 · 0 评论 -
Spring IOC 容器源码分析 02 - IOC 容器启动过程分析
1. 简介前面一篇文章,分析了 Spring IOC 容器的一些特性。从这篇文章开始,我们会开始进入源码的分析阶段。本篇文章会带大家先俯瞰 IOC 容器启动的整个过程,让读者先从整体上对 IOC 容器有个大体的认识。后面的文章,我会对容器启动过程中关键的点,进行深入的分析。好了,废话少说,下面开始看源码。2. BeanFactory 和 ApplicationContext在开始阅读源码之...原创 2020-03-24 14:52:52 · 214 阅读 · 0 评论 -
Spring IOC 容器源码分析 01 - IOC 容器特性介绍
1. 简介对于一个 Java 开发人员来说,Spring 框架是再熟悉不过的了。但我们很多时候都只停留在会使用的层面,或者能大概说出 IOC 的原理,但是对具体的实现细节不是很清楚。对于一个我们经常打交道的框架,还是很有必要搞清楚其中的原理。另外,本系类的源码分析文章源码是基于 Spring 4.3.17.RELEASE 版本编写的。本系列文章是对 Spring 源码的分析,适合使用过 Spr...原创 2020-03-24 14:52:29 · 206 阅读 · 0 评论 -
Java中为什么不能创建泛型数组
首先我们来看一个简单的例子Integer[] intArr = new Integer[1];Object[] objArr = intArr;objArr[0] = "xxx";上面的这段代码是可以正常编译的,但在运行这段代码的时候会报异常java.lang.ArrayStoreException这是因为数组在创建的时候就确定了元素的类型,并且会记住该类型,每次向数组中添加值的时候,...原创 2019-04-23 17:24:07 · 598 阅读 · 0 评论 -
Java泛型中的通配符<?>,<? extends T>,<? super T>
之前一直对Java泛型中的通配符不是很清楚,前几天专门研究了一下。Java中的泛型通配符分为以下三种:<? extends T> 子类型限定通配符<? super T> 超类型限定通配符<?> 无限定通配符通配符的使用场景通配符只有在修饰一个变量或参数的时候会用到,在定义泛型类或泛型方法的时候是不能使用通配符的。为了更好的说明泛型通配符的使用,...原创 2019-04-23 17:20:12 · 1829 阅读 · 0 评论 -
Java泛型中的桥方法(Bridge Method)
前几天在看 Java 泛型的时候,发现了一个有趣的现象。就是在某些情况下,编译器在编译我们的类文件的时候会帮我们自动生成某些方法,称作桥方法。我们知道 Java 中的泛型在编译为 class 的时候会把泛型擦除,也就是说你写的 到最后 class 文件中其实都是 Object,看下面代码示例:public class A<T> { private T value; ...原创 2019-04-22 11:02:19 · 2219 阅读 · 9 评论 -
Java8新特性一览
一、优化点HashMap当单链表数量大于8时转为红黑树ConcurrentHashMap去掉了分段锁的设计,改为使用CAS实现取消了JVM内存中的方法区,使用元空间替代(Matespace),使用直接内存二、Lambad表达式可以将一个方法作为参数进行传递,可以理解为匿名内部类的语法糖基本语法:() -> {}左侧:Lambad表达式的参数列表右侧:Lambad表达式...原创 2019-04-22 10:38:55 · 339 阅读 · 0 评论