
源码分析
文章平均质量分 67
zhangzhen02
这个作者很懒,什么都没留下…
展开
-
一场技术破案的经过
关于http Session 和 websocket Session 过期事件 源码分析原创 2022-08-05 10:05:37 · 1298 阅读 · 1 评论 -
AQS相关问题总结
通过对AQS及相关类的源码分析,我得到以下总结。AQS 的底层原理AQS是一个同步框架,内部实现了一个同步队列,在acquire/shared和release/shared方法中,经tryRelease和tryAcquire判断,对调用线程进行了入队挂起或激活抢锁操作。而判断的细节tryRelease和tryAcquire交由子类实现,以适应不同场景的需要。基于此可以实现各种各样的锁及相关工具。对于 CountDownLatch 和 CyclicBarrier,semaphore的认识countDo原创 2022-01-06 11:20:01 · 478 阅读 · 0 评论 -
AQS之Condition源码刨析
Condition是AQS的一个内部类里面维护了一个等待队列public class ConditionObject implements Condition, java.io.Serializable { private transient Node firstWaiter; private transient Node lastWaiter; public ConditionObject() { }...原创 2022-01-05 21:07:55 · 248 阅读 · 0 评论 -
CopyOnWriteArrayList 与CopyOnWriteArraySet详解
CopyOnWriteArrayList一,类基本属性public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { //可重入锁 final transient ReentrantLock lock = new ReentrantLock(); //底层是个volatile修饰的array private原创 2021-12-23 16:36:17 · 1648 阅读 · 0 评论 -
spingcloud gateway 请求流程 源码分析
一,源起@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }}进入了SpringApplication.run()二,SpringApplication public static ConfigurableApplicati原创 2020-12-10 14:49:23 · 506 阅读 · 0 评论 -
spring cloud 实现灰度发布,多个服务指向同一个路由的错误解决及源码分析
前文中,我自定义一个gatewayRule,实现了根据参数进行路由,从而实现灰度发布的功能。在本地自测的时候,运行良好。放到测试环境后,发现一个重大bug。所有的服务都会走同一个路由,所以服务A请求服务B时,却会调用到服务C!自己引入的bug,自己跪着也要解决。开始经历了层层排查历史,并最终解决问题。一,接着前文讲起,RibbonLoadBalancerClient中public ServiceInstance choose(String serviceId, Object hint) {//查询s原创 2020-12-08 14:00:58 · 417 阅读 · 0 评论 -
spring cloud Ribbon 源码分析
前两文写了ribbon的根据传参进行自定义负载均衡,今天要解释一下,为什么能够这样做。将这几天的源码查看,做一个记录,以备日后分享。当我们使用了@LoadBalanced注解后,就具有了负载均衡的能力。现在开始解密之旅。一,@LoadBalanced@LoadBalanced@beanpublic RestTemplate restTemplate() { return new RestTemplate();}发生了一些神秘的变化,一切开始不同。看一下这个注解/** * Anno原创 2020-11-26 20:46:41 · 206 阅读 · 0 评论 -
JVM逃逸分析,作用及实战案例
一,是什么是逃逸分析?逃逸分析是分析指针可以存储的所有地方,用于判断指针是否能确保在当前线程。我理解的就是用来分析,一个对象是否仅在某个线程被访问到。二,为什么要进行逃逸分析?在JIT时,进行逃逸分析后,就可以确定对象仅在某一线程中被访问到,这样JIT就可以对其方法进行优化。包括:1.堆分配转化为栈分配2.锁消除3.分离对象或标量替换具体方式见下文。三,判断逃逸的标准有哪些?1.对象被赋值给堆中的变量或者类的静态变量2.对象被传进了不确定的代码中运行下面举几个例子public c原创 2020-06-30 15:20:44 · 702 阅读 · 0 评论 -
AQS之CyclicBarrier源码解析
CyclicBarrier同步器经常被问到,跟CountDownLatch有什么区别。区别还是很大的。我们从源码看一下:继承关系及属性public class CyclicBarrier { private static class Generation { boolean broken = false; } private final ReentrantLock lock = new ReentrantLock(); /** Condition to原创 2020-06-08 15:34:29 · 259 阅读 · 0 评论 -
AQS之Semaphore源码解析
看几个主要方法abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1192457210091910933L; Sync(int permits) { setState(permits); } final int getPermits() {原创 2020-06-04 21:08:52 · 165 阅读 · 0 评论 -
AQS之countDownLatch源码解析
首先看内部结构public class CountDownLatch { /** * Synchronization control For CountDownLatch. * Uses AQS state to represent count. */ private static final class Sync extends AbstractQueuedSynchronizer { private static final long se原创 2020-06-04 20:24:29 · 354 阅读 · 0 评论 -
浅显易懂的AQS源码分析,并实现自定义锁
AQS是什么?AQS(AbstractQueuedSynchronizer)是Java中重要的同步框架。该框架实现了大部分的同步器功能,使使用者仅覆盖几个简单的方法就可以得到各种各样的同步器,包括ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock,ThreadPoolExecutor等,当然也可以很简单的实现我们自己定义的同步器。从ReentrantLock说起。当我们使用一个ReentrantLock时Lock lock=ne原创 2020-06-04 14:49:11 · 205 阅读 · 0 评论 -
Atomic类怎么保证原子性的?有什么问题?
Atomic类是通过Unsafe类,实现的原子性。而Unsafe类是由native方法实现的。看下源码:public class AtomicInteger extends Number implements java.io.Serializable { public final int getAndIncrement() { return unsafe.getAndAddInt(this, valueOffset, 1); }}Unsafe类public final原创 2020-06-02 16:45:33 · 1382 阅读 · 0 评论 -
Synchronized实现原理,以及偏向锁,轻量级锁,重量级锁都是什么?怎么升级的?
Synchronized实现原理一个对象在内存中分为对象头,实例变量,和对其填充。实例变量是用来存本对象的属性信息,对其填充使该对象保持占用8字节的整数倍。那对象头具体是什么呢?对象头分为三部分:MarkWord,指向类的指针,数组长度(只有数组对象才有)。那么问题就来了,MarkWord是什么?MarkWord存了对象跟锁有关的信息。这就是今天我们要讲的内容。具体见下图,64位虚拟机时。首先我们看重量级锁,标志为是10.储存了指向监视器monitor对象的指针,monitor对象是有C+原创 2020-06-02 15:20:07 · 1760 阅读 · 0 评论 -
5种IO模型的原理
阻塞IO,非阻塞IO,IO多路复用是三种常见的IO模型。那么他们有什么区别?我下面以unix的实现过程来说明,他们的实现原理和区别。阻塞IO当进程(用户空间)调用recvfrom命令,其系统调用将会一直阻塞,直到recvfrom命令返回或执行过程报错。具体阻塞过程分为:等待数据到达内核空间,数据从内核空间复制到用户空间。非阻塞IO由于内核是否准备好数据,是可以通过recvfrom查询得到的,如果数据没有准备好,会返回一个错误EWOULDBLOCK,我们可以通过轮训该错误码来判断数据是否准备好,原创 2020-05-29 18:19:42 · 643 阅读 · 0 评论 -
spring bean的生命周期有哪些?有什么可扩展的?
spring bean 的生命周期在scope为单例模式下,spring bean的生命周期如下图1.首先实例化bean对象。如果是beanFactory容器,当客户请求一个尚未实例化的bean时,或需要依赖注入一个汕尾实例化的bean时,容器会通过调用createBean进行该bean的实例化。对于ApplicationContext容器,在容器启动结束后,就会实例化所有bean。容器通过调用beanDefinition获取bean信息进行实例化,此步骤仅仅是简单的实例化,并未进行依赖注入。原创 2020-05-25 16:43:35 · 520 阅读 · 0 评论 -
spring中bean循环依赖有哪些?spring都是怎么解决的?
循环依赖A依赖B,B又依赖A,导致循环嵌套。Spring中一共又三种循环依赖的现象。1.构造器中的循环依赖。直接报错2.单例scope下setter方法的循环依赖。使用三级缓存解决3.非单例scope的循环依赖。不解决,由用户处理。spring具体是如何处理的?1.构造器中的循环依赖。spring中存在一个正在创建对象的池子,创建对象时添加到该池子,this .singletonsCurrentlylnCreation.add(beanName)。创建完成从池子删除。试图创建某对象时,这样当原创 2020-05-14 20:31:26 · 328 阅读 · 0 评论 -
到底什么是IoC?有什么好处?怎么实现的?
首先说下依赖倒置依赖倒置是种设计原则,把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层建筑。比如你要堆个积木,比如一个城堡,看看手里有一些完成的模块,来对城堡,就是城堡在依赖模块。即高层依赖底层。一旦子模块改变,你就要重新设计城堡了。如果这种层次较多,那修改起来肯定是个噩梦。而依赖倒置原则,即是根据城堡的设计图,设计子模块,子模块必须根据城堡设计图的要求设计,这样就是底层建筑依赖高层建筑了,也即是依赖倒置了。IoC 依赖反转,是依赖倒置原则下的一种设计思路,具体的实现方法就是依赖注入原创 2020-05-14 15:33:47 · 766 阅读 · 0 评论 -
ConcurrentHashMap源码分析及高频面试问题答案
类结构:public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable {继承自AbstractMap, 实现了ConcurrentMap接口。重要的变量//数组,即“桶” transient volatile Node<K,V>[] table; //扩容时新建的桶 private tra原创 2020-05-13 20:40:50 · 437 阅读 · 0 评论 -
TreeMap源码分析及高频面试问题答案
TreeMap实现了红黑树的结构,实现了有序map。继承结构public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.SerializableTreeMap继承自AbstractMap,实现了NavigableMap接口。1.AbstactMap实现了基本的map操作2.NavigableMap接口继承原创 2020-05-12 16:53:32 · 654 阅读 · 0 评论 -
LinkedHashMap源码分析及高频面试问题答案
首先看继承结构public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>可以看到LinkedHashMap继承自 HashMap.成员变量transient LinkedHashMap.Entry<K,V> head;transient Linked...原创 2020-05-08 17:14:56 · 438 阅读 · 0 评论 -
HashMap源码分析及高频面试问题答案
首先看下继承结构public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable继承自AbstractMap,并实现了Map等方法。主要成员变量和一些常量 //默认初始容量16 static final int ...原创 2020-05-07 20:28:23 · 202 阅读 · 0 评论 -
LinkedList源码分析及高频面试问题答案
首先看下继承结构public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable继承自AbstractSequentialList,并实现了List,...原创 2020-05-07 13:32:25 · 140 阅读 · 0 评论 -
ArrayList源码分析及高频面试问题答案
一,首先看ArrayList 中的两个重要的变量transient Object[] elementData; //数组容量private int size; //实际存的元素个数下文将会频繁提及它们。二,看下构造方法构造方法1: public ArrayList(int initialCapacity) { if (initialCapacity > 0) {...原创 2020-04-30 17:00:55 · 203 阅读 · 0 评论 -
JMM中happens-before 你了解多少?
什么是happens-before原则?从JDk1.5开始,JMM(java 内存模型)就是用happens-before原则来保证内存可见性。即,如果一个线程的操作的结果必须被另一个线程可见,那么他们必须符合happens-before原则。下面是happens-before原则规则:程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;锁定规则:一个un...原创 2020-04-29 22:19:37 · 170 阅读 · 0 评论 -
volatile的秘密
volatile有什么作用?1.内存可见性,即所有线程都能看到共享内存的最新状态2.防止指令重排。什么是内存可见性?每个线程都有自己的工作内存,所有线程共享主存。结构如下图:Java通过几种原子操作完成工作内存和主内存的交互:lock:作用于主内存,把变量标识为线程独占状态。unlock:作用于主内存,解除独占状态。read:作用主内存,把一个变量的值从主内存传输到线程的工作内...原创 2020-04-29 21:48:10 · 149 阅读 · 0 评论 -
String,StringBuffer,StringBuilder全面分析
三者区别是什么?总的来说:String 是个字符串常量,StringBuilder是一个非线程安全的字符串变量,StringBuffer是一个线程安全的字符串变量。源码分析:String是一个不可变的char[] 数组。源码如下:public final class String implements java.io.Serializable, Comparable<Stri...原创 2020-04-29 16:05:49 · 146 阅读 · 0 评论 -
自动装箱自动拆箱的实现原理
什么是自动装箱和自动拆箱?自动装箱就是Java自动将原始值类型转变为对应的对象,如int 自动转变为Integer的过程。自动拆箱则反之。Java是怎么实现自动装箱和拆箱的?测试代码如下:public class AutoPacking { Integer i1= 1; int i2=new Integer(2);}编译后,进行反汇编,得到代码如下:public ...原创 2020-04-29 15:06:35 · 648 阅读 · 0 评论 -
强引用软引用弱引用虚引用使用场景与注意事项
强引用:生成方式:new 出来的对象。 Object object = new Object();释放时机:1.需要手动释放object=null;2.线程结束,只在本线程中的强引用会被gc标记为可回收。用处:想随时获取到该对象,不想被垃圾回收器gc收回,符合大部分应用场景。注意事项:注意集合类型中的强引用的释放问题,如:String strongReference = ...原创 2020-04-27 19:59:13 · 803 阅读 · 0 评论 -
一文掌握ThreadLocal
一,ThreadLocal是什么?threadlocal是一个创建线程局部变量的类。通过该方法可以使一个对象变成该线程独享,从而实现线程安全。比如SimpleDateFormat 类是非线程安全的,我们使用ThreadLocal将其变成线程安全的对象。SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:...原创 2020-04-28 20:41:09 · 123 阅读 · 0 评论