JDK、JUC源码
文章平均质量分 90
JDK、JUC源码
Today不上发条
我们似乎总会在某一年,爆发性地长大,爆发性地觉悟,爆发性地知道某个真相,让原本没有什么意义的时间的刻度,成了一道分界线。-—《老灵魂》
展开
-
CopyOnWriteArrayList 简单解析
CopyOnWriteArrayList简述选中类,执行Ctrl + alt + U 查看类的继承示意图如下:public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { }实现了List, RandomAccess, Cloneable, java.io.Serializable等接口实现了List原创 2022-02-21 14:37:12 · 281 阅读 · 4 评论 -
ConcurrentSkipListMap以及跳表的原理
ConcurrentSkipListMap底层实现是”跳跃表“ ,Redis当中Zset同样采用的是该数据结构跳跃表的结构图:特点:其根本思想是 二分查找 的思想。跳表的前提条件是 针对 有序的单链表 ,实现高效地查找,插入,删除。Redis中的 有序集合 sorted set 就是用跳表实现的。1、跳表的原理种基于单链表的高级数据结构, 跳表 将单链表先进行排序,然后针对 有序链表 为了实现高效的查找,可以使用跳表这种数据结构。对于单链表,即使是 存储的有序数据(即 有序链原创 2021-12-29 21:45:06 · 1649 阅读 · 24 评论 -
ThreadLocal 源码分析
ThreadLocal原理一、ThreadLocal简介ThreadLocal 能实现每一个线程都有自己专属的本地变量副本,不同线程之间不会相互干扰,主要解决了让每个线程绑定自己的值,通过使用get()和set()方法,获取默认值或将其值更改为当前线程所存的副本的值从而避免了线程安全问题。简述:就是设置一个共享变量为线程局部变量,那么这个变量就会创建一个副本以<线程,value>的形式保存在ThreadLocal对象当中!二、ThreadLocal的使用ThreadLocal类接口很简原创 2021-10-26 14:10:26 · 295 阅读 · 0 评论 -
ConcurrentHashMap1.8 源码分析
一、容器初始化在jdk8的ConcurrentHashMap中一共有5个构造方法,这四个构造方法中都没有对内部的数组做初始化, 只是对一些变量的初始值做了处理jdk8的ConcurrentHashMap的数组初始化是在第一次添加元素时完成//没有维护任何变量的操作,如果调用该方法,数组长度默认是16public ConcurrentHashMap() {}//传递进来一个初始容量,ConcurrentHashMap会基于这个值计算一个比这个值大的2的幂次方数作为初始容量public Conc原创 2021-10-24 15:22:10 · 2781 阅读 · 2 评论 -
ConcurrentHashMap 1.7 源码分析
ConcurrentHashMap 1.7 原理由于源码当中涉及Unsafe,先对其做一个解释Unsafe介绍1、Unsafe简介Unsafe类相当于是一个java语言中的后门类,提供了硬件级别的原子操作,所以在一些并发编程中被大量使用。jdk已经作出说明,该类对程序员而言不是一个安全操作,在后续的jdk升级过程中,可能会禁用该类。所以这个类的使用是一把双刃剑,实际项目中谨慎使用,以免造成jdk升级不兼容问题。2、Unsafe Api这里并不系统讲解Unsafe的所有功能,只介绍和接下来内容原创 2021-10-23 18:37:32 · 279 阅读 · 2 评论 -
手撕线程池 ThreadPool
为了更加方便理解线程池我们都知道线程池和任务就好比生产者消费者之间的关系也就是如图!先分析:我们可以将线程池中的线程看作消费者,可以将main(只是方便测试)看作生产者总体思路:实现一个阻塞队列,因为阻塞,阻塞队列是连接他们的桥梁,我们线程池中的线程去队列中获取任务执行,而我们main,提供任务到阻塞队列中供线程池执行!其次我们需要实现ThreadPool,我们可以在主线程当作消费者!第一步:分析阻塞队列我们阻塞队列当中应当包含一个任务队列,来记录我们待执行的任务还应该给任务队列的对头.原创 2021-10-22 16:26:27 · 369 阅读 · 0 评论 -
JUC并发编程笔记(下)线程池、AQS、ReentrantLock
六、线程池我们先了解一个整个线程池的执行流程,类似于生产者消费者模式分析大致流程:主线程生产task(任务),如果阻塞队列不满就放入阻塞队列,否则当前线程进入waitSet等待,但是这种等待对于主线程是不利的,因为这样的话它会一直无限期的等,我们可以通过设置超时等待,或添加拒绝策略,来解决这个问题!其次就是线程池中会有多个线程,线程调用任务前判断,任务队列中的任务是否为空,如果为空则等待,否则线程获取任务执行,任务是线程安全的保证了一个任务只能由一个线程去执行!以后可以尝试,手写一个线程池原创 2021-10-21 18:03:16 · 516 阅读 · 9 评论 -
JUC并发编程笔记(中)Volatile、CAS、LongAdder
四、共享模型之内存Java内存模型(JMM)JMM即为 Java Memory Model ,他定义了主存(多个线程所共享的空间、例:成员变量)、工作内存(线程的私有空间,例:局部变量)的抽象概念,对应着底层的CPU寄存器、缓存、硬件内存、CPU指令优化等;概要:我们通过操作java这些抽象概念,间接的操作复杂底层(化繁为简)JMM体现在以下的几个方面 :原子性:保证指令不会受到线程的上下文切换的影响可见性:保证指令不会受到CPU缓存的影响有序性:保证指令不会受到CPU指令优化的影响原创 2021-10-13 23:52:44 · 211 阅读 · 0 评论 -
JUC并发编程笔记(上)多线程基础知识、Synchronized优化、ReentrantLock
JUC并发编程一、前言篇一、进程和线程进程:进程是资源分配的最小单位线程:线程是CPU调度的最小单位,一个进程中可以包含多个线程二、并发和并行并发:同一时间,应对多件事情的能力;例如:多个线程争抢一个CPU核心 ;并线:同一时间,做多件事情的能力;例如:CPU有两个核心,同一时间,线程1和线程2分别用着2个核心!三、同步和异步同步:需要等待结果的返回,同步运行异步:不需要等待结果的返回,异步运行多线程能否提升效率?对于单核来说,并不会提升效率,这种情况开多个线程依旧是一个核心再运原创 2021-10-10 11:29:18 · 275 阅读 · 0 评论