java
zhaoziyun21
这个作者很懒,什么都没留下…
展开
-
HashMap源码分析持续更新中
HashMap底层是数组 + 链表数组的下标是由key做hash寻址之后的值put方法hash优化(h = key.hashCode()) ^ (h >>> 16)用key的高16位跟低16位做异或运算,使结果同时包含高位和低位的特征,更加分散数据数组寻址数组长度都是2的整数次方(n - 1) & hash <==> hash % n数...原创 2020-03-22 23:24:11 · 162 阅读 · 0 评论 -
ThreadLocal源码分析
ThreadLocalThreadLocal、ThreadLocalMap、Thread、EntryThread 持有 ThreadLocalMapThreadLocalMap 内部存储是 Entry[]Entry[] 初始长度 16, 使用长度超过1/2时扩容Entry[]的索引是 ThreadLocal的 hashcode & (len-1)为初始值,如果已经被占用,则往后循...原创 2020-03-20 22:27:53 · 258 阅读 · 0 评论 -
对AQS的理解
AQS?AQS的全称:AbstractQueuedSynchronizer,抽象队列同步器java并发包下很多API都是基于AQS来实现的加锁和释放锁等功能的,AQS是java并发包的基础类。ReentrantLock、ReentrantReadWriteLock底层都是基于AQS来实现的。看一下ReentrantLock和AQS之间的关系ReentrantLock内部包含了一个AQS对...原创 2019-04-22 10:54:07 · 799 阅读 · 2 评论 -
java并发包中的公平锁与非公平锁有啥区别
什么是非公平锁?如上图,现在线程1加了锁,然后线程2尝试加锁,失败后进入了等待队列,处于阻塞中。然后线程1释放了锁,准备来唤醒线程2重新尝试加锁。注意一点,此时线程2可还停留在等待队列里啊,还没开始尝试重新加锁呢!然而,不幸的事情发生了,这时半路杀出个程咬金,来了一个线程3!线程3突然尝试对ReentrantLock发起加锁操作,此时会发生什么事情?很简单!线程2还没来得及重新尝试加锁...原创 2019-04-22 22:51:47 · 603 阅读 · 0 评论 -
对volatile的理解?
先上一张图java内存模型中,每个线程有自己的工作内存,同时还有一个共享的主内存。比如说有两个线程,他们的代码里都需要读取data这个变量的值,那么他们都会从主内存里加载data变量的值到自己的工作内存,然后才可以使用那个值。现在大家从图里看到,每个线程都把data这个变量的副本加载到了自己的工作内存里了,所以每个线程都可以读到data = 0这个值。这样,在线程代码运行的过程中,对da...原创 2019-04-24 13:17:21 · 151 阅读 · 0 评论 -
CAS理解、优化及ABA问题
Atomic原子类,比如说AtomicInteger。他可以保证多线程并发安全的情况下,高性能的并发更新一个数值。我们来看下面的代码:多个线程需要对一个变量不停的累加1,比如说下面这段代码:大家看上面的代码,是不是很简单!多个线程可以并发的执行AtomicInteger的incrementAndGet()方法,意思就是给我把data的值累加1,接着返回累加后最新的值。实际上,Atomic...原创 2019-04-24 22:36:17 · 256 阅读 · 0 评论 -
第一周JVM原理
启动java程序,先加载指定的main方法的class文件到方法区,然后通过验证、准备、解析、初始化等阶段,通过字节码执行引擎执行字节码指令,每执行到一个需要使用的类时,就会去重复加载、验证、准备、解析、初始化等阶段,程序计数器用来记录线程执行到指令的位置,java虚拟机栈用来存放运行到的方法以及方法内的局部变量,方法运行完毕,出栈,堆内存用来存放实例化出来的对象。 ![在这里插入图片描述](...原创 2019-07-13 11:41:30 · 91 阅读 · 0 评论 -
JVM第二周
本周的作业非常简单,希望每个人按照案例里分析的那个过程,把你手头负责的系统的核心业务流程简化、抽象以及梳理出来,看看你们线上的真实负载情况,每秒钟多少请求?然后根据你们的核心业务流程,看看每秒钟你负责的系统对内存使用的压力有多大?接着你再思考一下,就你的系统内存使用压力之下,目前你们线上机器是多大的堆内存?新生代多大?老年代多大?如果没设置,可以自行百度默认的内存大小。然后分析一下,目前的这个内...原创 2019-07-13 17:27:19 · 112 阅读 · 0 评论 -
JVM第三周:G1回收器之前的GC相关
1、youngGC15次还存活2、同一批相同年龄的对象大于 50%,大于这批年龄的对象进入 老年区3、大对象,超过XX:PretenureSizeThreshold设置,直接进入老年区4、youngGC存活对象大于suvivor,整体到老年区5、youngGC之前的老年代空间担保规则1)老年代可用空间 > 新生代所有对象总和 2)老年代可用空间 < 新生代所有对象总和 ...原创 2019-07-17 11:43:04 · 236 阅读 · 0 评论