
JDK源码分析
文章平均质量分 91
无唯~
这个作者很懒,什么都没留下…
展开
-
JDK源码系列——线程池源码解析
这个是线程保持空闲的时间,可能很长一段时间都没有任务提交过来,那么线程池中的线程都处于空闲状态,但是他们还占用资源,所以当线程数量超过了核心线程数,并且有线程超过了keepAliveTime时间一直处于空闲状态,那么就会把他干掉,直到线程数减少到核心线程数。这里你可能想问为啥不再继续创建线程,反正还没到最大线程数,再创建线程当然可以,但是如果核心线程数处理的很快,可能过了很短的时间就能空闲出来继续处理任务,那么就可以避免掉线程频繁创建销毁的开销了。这里我们创建了一个线程池,并且批量往线程池中提交任务。原创 2023-03-05 23:31:36 · 1527 阅读 · 0 评论 -
JDK源码系列——ReentrantReadWriteLock源码解析
> 1. ReentrantReadWriteLock提供了读写锁,适用于读多写少的场景,提高吞吐量> 2. 读写锁读读不互斥,读写互斥> 3. 当一个读线程获取锁的时候,不是一次性唤醒后续等待的所有读线程,而是接力一个接一个唤醒的,可能是为了防止同时过多的上下文切换> 4. 只有多个读锁都完全释放了才会唤醒下一个写线程,这种场景下可能会导致写线程饥荒,因为一直存在读线程。...原创 2022-07-10 22:36:50 · 480 阅读 · 0 评论 -
JDK源码系列——ReentrantLock源码解析
ReentrantLock是一个可重入锁,其底层是基于AQS来实现的,AQS(AbstractQueuedSynchronizer),它是java几乎所有锁和同步器底层的一个基石框架,AQS是基于FIFO的队列实现,内部维护了一个状态变量state,通过CAS更新这个状态变量来实现枷锁解锁等操作。...原创 2022-07-10 21:21:32 · 300 阅读 · 0 评论 -
JDK源码系列——PriorityQueue源码解析
优先级队列是包含0个或多个元素的集合,每个元素都一个权重值,每次出队弹出优先级最大或最小的元素,优先级队列是使用堆来实现了,所以大家看之间需要首先掌握堆结构。原创 2022-07-03 18:31:40 · 323 阅读 · 0 评论 -
JDK源码系列——ConcurrentHashMap源码分析
由于HashMap不是线程安全的,在多线程环境下可能会发生错乱,死循环等问题,而HashTable虽然是线程安全的,但是是直接在方法上添加Synchronized来保证线程安全的,在高并发的情况下效率十分低下,因为读写也是互斥的。而ConcurrentHashMap是HashMap的线程安全版本,由于内部结构设计的优化,导致相比HashTable效率各方面都有极大的提高这里分段锁的实现很值得学习,通过分段的方式扩大并发度,从而提升读写效率,而且这里统计的时候也是没有直接加锁,而是采用了一种折中的方案,先进行原创 2022-06-26 16:22:07 · 523 阅读 · 0 评论 -
JDK源码系列-LinkedHashMap实现原理
为什么有了还需要,因为是通过的方式进行插入元素,所以迭代的时候并不是插入的顺序,有些场景下我们需要实现一个有序的,就比如缓存策略,这个时候就可以使用,它内部维护了一个双向链表,能根据元素的访问顺序遍历或根据元素的插入顺序遍历。这里发现的实现非常简单,都是通过中留下的钩子函数来实现扩展逻辑,不需要再重写put,方法了,所以在做代码的设计上一定要预留足够的扩展点,以方便后续的功能扩展。...原创 2022-06-25 16:07:27 · 364 阅读 · 0 评论 -
JDK源码系列-CopyOnWriteArrayList实现原理
CopyOnWrite是一种读写分离的思路,写入的时候会对原数组copy一份出来然后再做修改,适用于读多写少的场景,可以最大程度提升读效率。从上面方法的源码流程可以看出也是存在很多的弊端的,因为读写分离,其实我们读取的数据可能不是最新的一份数组,所以不保证实时一致性,只保证最终一致性,而且如果是读写均匀或者写多读少的情况下,那么就会造成存在多份副本数据,这个时候就会造成频繁的。...原创 2022-06-25 15:08:58 · 281 阅读 · 0 评论 -
JDK源码系列-HashMap实现原理
一、简介HashMap是采用hash表实现的,key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序;二、继承类图hashMap实现了Cloneable,表示可以进行克隆hashMap实现了Serializable,表示可以进行序列化hashMap继承了AbstractMap,...原创 2022-02-13 21:42:18 · 442 阅读 · 0 评论 -
JDK源码系列-LinkedList实现原理
一、LinkedList的继承类图这里可以看到LinkedList实现了Deque接口,也实现了List接口,说明它既可以作为一个顺序容器,也可以作为一个队列使用。LinkedList实现Cloneable,可以被克隆。LinkedList实现Serializable,可以被序列化二、LinkedList的成员变量 //队列长度 transient int size = 0; //头节点 transient Node<E> first; //尾节点原创 2021-12-19 00:23:13 · 137 阅读 · 0 评论 -
JDK源码系列-ArrayList实现原理
一、ArrayList的继承类图Arraylist实现List,提供了基础的添加、删除、遍历等操作。ArrayList实现RandomAccess,提供随机访问的能力。ArrayList实现Cloneable,可以被克隆。ArrayList实现Serializable,可以被序列化二、ArrayList的成员变量 //默认的初始化容量 private static final int DEFAULT_CAPACITY = 10; //空的数组 private stat原创 2021-10-10 23:06:45 · 259 阅读 · 0 评论