源码解析
文章平均质量分 72
源码解析
白夜的Alice
这个作者很懒,什么都没留下…
展开
-
AQS探究
juc其实就是包的缩写(java.util.concurrnt),通过下图展示了JUC里面有什么类。AbstractQueuedSynchronizer(抽象队列同步器,简称AQS),就是J.U.C包的骨架,基于AQS,J.U.C包得以实现了的重入锁、读写锁、CountDownLatch(计数锁)、Semaphore(信号量)和FutureTask等类。AQS中主要维护了state(锁状态的表示)和一个可阻塞的等待队列。state是临界资源,也是锁的描述。表示有多少线程获取了锁。private vol原创 2022-03-15 13:45:06 · 314 阅读 · 0 评论 -
动态代理原理解析 (二):cglib
面对没有接口的类,可以使用基于cglib的动态代理,对于final方法无法代理。cglib的底层是使用字节码处理框架asm操纵字节码生成代理类,操纵的级别是底层JVM的汇编指令级别。使用案例:<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2&l原创 2022-01-18 01:05:46 · 261 阅读 · 0 评论 -
动态代理原理解析 (一):Proxy
动态代理分为两种:Java自带的Proxy动态代理和cglib的动态代理。Proxy动态代理是基于接口的,只能对实现了接口的类生成代理,而对于普通类的代理cglib能胜任。例如在Spring中有接口默认JDK代理,无接口使用CGLIB,但可以配置强制全部使用CGLIB代理。XML<aop:aspectj-autoproxy proxy-target-class="true"/>配置文件或注解#配置文件spring.aop.proxy-target-class=true#注解@原创 2022-01-17 23:21:45 · 346 阅读 · 0 评论 -
ThreadLocal 源码解析
ThreadLocal为每一个线程提供独立的变量副本,可以解决多线程并发访问变量的冲突问题。即每个线程都有自己的、独立初始化的变量副本,规避了线程安全问题。public class ThreadLocal<T>只有一个空的构造器,里面什么也没做public ThreadLocal() {}看看它的重要方法 get() ,其中最重要的ThreadLocalMap稍后会讲public T get() { //当前线程 Thread t = Thread.curre原创 2021-12-20 15:42:26 · 207 阅读 · 0 评论 -
JVM调优测试记录
本项目启动时间太短了,而且没用过多的连接使用,因此只能作为测试看看,实际调优前应当先压力测试。可以看到初始堆内存268M最大堆内存520M新生代89M最大173M,老年代179M。使用top-HpPID查看该进程下所有线程,以此可以查到占用CPU最大的线程。服务器实际1.7G内存,其他占用百分之六十多,java占用25%,测试项目不大。默认ES0S1为811,默认新生代和老年代比例为12,服务器内存占用过高,直接卡死了,幸好已经导出来快照,明天再来。VisualVM的分析。......原创 2021-12-16 17:22:41 · 552 阅读 · 0 评论 -
Arrays.sort方法源码分析
上一篇博客分析了Collections.sort ,不得不写一下Arrays.sort,但精力和水平有限,只能浅显说明,引用旁文。Arrays.sort()有很多个重载形式根据源码实现可以分为两种:1.基本数据类型排序2.对象排序对基本数据类型排序调用的是:翻译一下就是双轴快排可以看看这篇博客双轴快排DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);sort:static void sort(int[] a, int lef原创 2021-12-15 17:01:18 · 849 阅读 · 0 评论 -
Collections.sort方法源码分析
Collections.sort 有两种重载方式:1.默认比较器public static <T extends Comparable<? super T>> void sort(List<T> list)2.自定义比较器public static <T> void sort(List<T> list, Comparator<? super T> c)二者都调用的是同一种方法:default void sort(Comp原创 2021-12-15 16:31:54 · 379 阅读 · 0 评论 -
LinkedList源码分析
LinkedList : List和Deque接口的双向链表实现。它也可以被当作堆栈、队列或双端队列进行操作。作为平时常用的集合类,其实原理并没有十分复杂。LinkedList是非线程安全的,通过Collections.synchronizedList()可以使其变为线程安全。下面来看一下LinkedList的实现的接口和继承关系.public class LinkedList<E> extends AbstractSequentialList<E> impl原创 2021-12-13 17:46:54 · 399 阅读 · 0 评论 -
HashMap源码分析
HashMap是平时编码使用频繁的类,也是面试会经常问到的东西,源码有非常多的精妙的设计,通过阅读源码分析HashMap是非常有必要的,由于篇幅所限,在此只分析部分重要方法。HashMap和HashTable非常的相似,除了它是不同步的(非线程安全)并且可以为空值(key ,value)。不过可以通过Collections.synchronizedMap方法使其同步。下面先用图(来源)来描绘一下HashMap。HashMap由数组+链表+红黑树构成。HashMap继承AbstractMap并实现Ma原创 2021-12-08 21:31:23 · 389 阅读 · 0 评论 -
volatile原理探究
volatile在java语言规范的描述(jsl8):被volatile标记的变量为共享变量保证了不同线程对该变量操作的内存可见性;禁止指令重排序那volatile是如何做到保证可见性的呢?如下图所示:当某一线程改变共享变量时,更新主内存的值并会通知其他线程本地内存中的共享变量过期了。其他线程若要读取便会直接去读取主内存的值。禁止指令重排(有更好的博客,不再献丑):插入 内存屏障 博客之前的问题:作者在查看其他资料时看到:下图实际描述的不准确然后在jvm规范里看到:(规范表原创 2021-11-14 17:05:23 · 132 阅读 · 0 评论 -
Spring定时任务
一、如何使用编写定时任务类,加入IOC,一般使用@Component注解。在定时任务方法上使用@Scheduled注解,使用cron表达式标明运行时间设置,或使用fixedRate和fixedDelay在Springboot启动类上加@EnableScheduling注解开启定时任务。二、说明cron表达式:格式:{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}特殊字符意义:下面的单位以秒为例:“*” 代表每隔1单位触发“,” 代表在指定的单位触发,原创 2021-10-20 11:36:05 · 147 阅读 · 0 评论