【J.U.C源码】
文章平均质量分 93
J.U.C核心源码解析,使用场景分析
小小工匠
show me the code ,change the world
展开
-
Java Review - ArrayList 源码解读
文章目录概述方法的执行效率概述从类的继承图上我们可知道,ArrayList实现了List接口。同时List是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,ArrayList底层基于数组实现。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器自动扩容。ArrayList<E>,可以看到是泛型类型, Java泛型只是编译器提供的语法原创 2021-11-14 09:48:55 · 22912 阅读 · 0 评论 -
Java Review - LinkedList源码解读
文章目录Pre概述PreJava Review - ArrayList 源码解读概述从上图可知: LinkedList同时实现了List接口和Deque接口,既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack) 。当需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(它是个接口名字)。关于栈或队列,现在的首选是ArrayDeque原创 2021-11-14 11:19:13 · 23331 阅读 · 0 评论 -
Java Review - 并发编程_原子操作类原理剖析
文章目录概述原子变量操作类概述JUC包提供了一系列的原子性操作类,这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作这在性能上有很大提高。由于原子性操作类的原理都大致相同,我们以AtomicLong类的实现原理为例,并探讨JDK8新增的 LongAdder和LongAccumulator类的原理原子变量操作类JUC并发包中包含有AtomicInteger、AtomicLong和AtomicBoolean等原子性操作类AtomicLong是原子性递增或者递减类,其内部使用Uns原创 2021-11-29 00:10:45 · 26298 阅读 · 0 评论 -
Java Review - 并发编程_原子操作类LongAdder & LongAccumulator剖析
文章目录概述概述Java Review - 并发编程_原子操作类原理剖析中提到了 AtomicLong通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说它的性能已经很好了,但是JDK开发组并不满足于此。使用AtomicLong时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS操作会成功,这就造成了大量线程竞争失败后,会通过无限循环不断进行自旋尝试CAS的操作,而这会白白浪费CPU资源。因此JDK 8新增了一个原子性递增或者递减类LongAdder用原创 2021-11-30 22:58:01 · 25841 阅读 · 0 评论 -
Java Review - 并发编程_并发List_CopyOnWriteArrayList源码剖析
文章目录概述概述并发包中的并发List只有CopyOnWriteArrayList。CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略。...原创 2021-12-01 00:16:15 · 25999 阅读 · 0 评论 -
Java Review - 并发编程_LockSupport
文章目录概述主要方法概述位于rt.jar包的java.util.concurrent.locks目录中, 主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。主要方法...原创 2021-12-01 20:18:27 · 26381 阅读 · 0 评论 -
Java Review - 并发编程_独占锁ReentrantLock原理&源码剖析
文章目录概述概述ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞而被放入该锁的AQS阻塞队列里面。底层基于AQS实现,ReentrantLock的lock等方法,委托给其依赖sync的lock方法从类图可以看出,ReentrantLock最终还是使用AQS来实现的,并且根据参数来决定其内部是一个公平还是非公平锁,默认是非公平锁。 /** * Creates an instance of {@code ReentrantLo原创 2021-12-04 11:44:02 · 26662 阅读 · 0 评论 -
Java Review - 并发编程_读写锁ReentrantReadWriteLock的原理&源码剖析
文章目录ReentrantLock VS ReentrantReadWriteLock类图结构ReentrantLock VS ReentrantReadWriteLock解决线程安全问题使用ReentrantLock就可以,但是ReentrantLock是独占锁,某时只有一个线程可以获取该锁,而实际中会有写少读多的场景,显然ReentrantLock满足不了这个需求,所以ReentrantReadWriteLock应运而生。ReentrantReadWriteLock采用读写分离的策略,允许多原创 2021-12-04 16:46:57 · 26880 阅读 · 0 评论 -
Java Review - 并发编程_抽象同步队列AQS
文章目录概述 AQS——锁的底层支持概述 AQS——锁的底层支持AbstractQueuedSynchronizer抽象同步队列简称AQS,它是实现同步器的基础组件,并发包中锁的底层就是使用AQS实现的。另外,大多数开发者可能永远不会直接使用AQS,但是知道其原理对于架构设计还是很有帮助的。AQS是一个FIFO的双向队列,其内部通过节点head和tail记录队首和队尾元素,队列元素的类型为Node。其中Node中的thread变量用来存放进入AQS队列里面的线程;Node节点内部的SH原创 2021-12-05 00:58:14 · 27013 阅读 · 0 评论 -
Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析
文章目录概述ConcurrentLinkedQueue概述JDK中提供了一系列场景的并发安全队列。总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列,阻塞队列使用锁实现而非阻塞队列则使用CAS非阻塞算法实现ConcurrentLinkedQueueConcurrentLinkedQueue是线程安全的无界非阻塞队列,其底层数据结构使用单向链表实现,对于入队和出队操作使用CAS来实现线程安全。...原创 2021-12-05 08:48:21 · 27281 阅读 · 0 评论 -
Java Review - 并发编程_StampedLock锁探究
@[toc]概述StampedLock是并发包里面JDK8版本新增的一个锁,该锁提供了三种模式的读写控制, 当调用获取锁的系列函数时,会返回一个long 型的变量,我们称之为戳记(stamp),这个戳记代表了锁的状态。其中try系列获取锁的函数,当...原创 2021-12-05 13:22:26 · 27316 阅读 · 0 评论 -
Java Review - 并发编程_LinkedBlockingQueue原理&源码剖析
文章目录概述类图结构主要方法offer操作概述Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析介绍了使用CAS算法实现的非阻塞队列ConcurrentLinkedQueue,下面我们来介绍使用独占锁实现的阻塞队列LinkedBlockingQueue类图结构首先看一下LinkedBlockingQueue的类图结构,以便从全局对LinkedBlockingQueue有个直观的了解主要方法offer操作...原创 2021-12-05 15:37:37 · 29809 阅读 · 0 评论 -
Java Review - 并发编程_ArrayBlockingQueue原理&源码剖析
文章目录概述类图结构概述Java Review - 并发编程_LinkedBlockingQueue原理&源码剖析介绍了使用有界链表方式实现的阻塞队列LinkedBlockingQueue,这里我们继续来研究使用有界数组方式实现的阻塞队列ArrayBlockingQueue的原理。类图结构...原创 2021-12-05 19:17:27 · 30004 阅读 · 0 评论 -
Java Review - 并发编程_PriorityBlockingQueue原理&源码剖析
文章目录概述类图结构概述PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素。其内部是使用平衡二叉树堆实现的,所以直接遍历队列元素不保证有序。默认使用对象的compareTo方法提供比较规则,如果你需要自定义比较规则则可以自定义comparators。类图结构...原创 2021-12-05 23:44:47 · 30007 阅读 · 0 评论 -
Java Review - 并发编程_DelayQueue原理&源码剖析
文章目录概述类图结构概述DelayQueue并发队列是一个无界阻塞延迟队列,队列中的每个元素都有个过期时间,当从队列获取元素时,只有过期元素才会出队列。队列头元素是最快要过期的元素。类图结构...原创 2021-12-05 23:48:52 · 30549 阅读 · 0 评论 -
Java Review - 并发编程_ThreadPoolExecutor原理&源码剖析
文章目录线程池主要解决两个问题线程池主要解决两个问题一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,而线程的创建和销毁是需要开销的。线程池里面的线程是可复用的,不需要每次执行异步任务时都重新创建和销毁线程。二是线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等。每个ThreadPoolExecutor也保留了一些基本的统计数据,比如当前线程池完成的任务数目等。另外,线程池也提供了许多可调参数原创 2021-12-11 09:34:12 · 31163 阅读 · 0 评论 -
Java Review - 并发编程_ScheduledThreadPoolExecutor原理&源码剖析
文章目录概述类结构概述Java Review - 并发编程_ThreadPoolExecutor原理&源码剖析 我们复习了Java中线程池ThreadPoolExecutor的原理,ThreadPoolExecutor只是Executors工具类的一部分功能。下面来介绍另外一部分功能,也就是ScheduledThreadPoolExecutor的实现,这是一个可以在指定一定延迟时间后或者定时进行任务调度执行的线程池。类结构Executors其实是个工具类,它提供了好多静态方法,原创 2021-12-11 14:46:35 · 30604 阅读 · 0 评论 -
Java Review - 并发编程_ CountDownLatch原理&源码剖析
文章目录Pre小DemoPre每日一博 - CountDownLatch使用场景分析以及源码分析在日常开发中经常会遇到需要在主线程中开启多个线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后再进行汇总的场景。在CountDownLatch出现之前一般都使用线程的join()方法来实现这一点,但是join方法不够灵活,不能够满足不同场景的需要,所以JDK开发组提供了CountDownLatch这个类,使用CountDownLatch会更优雅.小Demo...原创 2021-12-11 19:43:44 · 30892 阅读 · 0 评论 -
Java Review - 并发编程_ 回环屏障CyclicBarrier原理&源码剖析
文章目录PrePreJava Review - 并发编程_ CountDownLatch原理&源码剖析介绍的CountDownLatch在解决多个线程同步方面相对于调用线程的join方法已经有了不少优化,但是CountDownLatch的计数器是一次性的,也就是等到计数器值变为0后,再调用CountDownLatch的await和countdown方法都会立刻返回,这就起不到线程同步的效果了。所以为了满足计数器可以重置的需要,JDK开发组提供了CyclicBarrier类,并且Cyclic原创 2021-12-12 11:02:30 · 30961 阅读 · 0 评论 -
Java Review - 并发编程_ 信号量Semaphore原理&源码剖析
文章目录概述小Demo概述Semaphore信号量也是Java中的一个同步器,与CountDownLatch和CycleBarrier不同的是,它内部的计数器是递增的,并且在一开始初始化Semaphore时可以指定一个初始值,但是并不需要知道需要同步的线程个数,而是在需要同步的地方调用acquire方法时指定需要同步的线程个数。小Demo...原创 2021-12-12 15:59:09 · 31188 阅读 · 1 评论 -
[并发编程] - Executor框架#ThreadPoolExecutor源码解读03
文章目录PrePre[并发编程] - Executor框架#ThreadPoolExecutor源码解读02说了一堆结论性的东西,作为开发人员着实是不过瘾,那这里我们就来剖根问底来看下线程池是如何工作的。原创 2020-09-08 00:12:02 · 9652 阅读 · 0 评论 -
[并发编程] - Executor框架#ThreadPoolExecutor源码解读02
文章目录Pre线程池的具体实现线程池的创建参数解读corePoolSizemaximumPoolSizekeepAliveTimeunitworkQueuethreadFactoryhandler任务提交方式一 提交任务无返回值方式二 提交任务有返回值线程池监控PreJava-Java中的线程池原理分析及使用[并发编程] - Executor框架#ThreadPoolExecutor源码解读01线程池的具体实现主要两大类ThreadPoolExecutorScheduledTh原创 2020-09-02 02:54:41 · 9594 阅读 · 0 评论 -
[并发编程] - Executor框架#ThreadPoolExecutor源码解读01
文章目录PreThreadJava线程与OS线程生命状态PreJava-Java中的线程池原理分析及使用Thread线程是调度CPU资源的最小单位,线程模型分为KLT模型与ULT模型。Java线程与OS线程JVM使用的KLT模型,Java线程与OS线程保持1:1的映射关系,也就是说有一个java线程也会在操作系统里有一个对应的线程 。[并发编程] - 操作系统底层工作原理使用new Thread 创建500个线程 public static void main(String[] a原创 2020-09-02 00:39:53 · 9790 阅读 · 0 评论 -
[并发编程] - 操作系统底层工作原理
文章目录冯诺依曼计算机模型CPU内部结构控制单元控制单元存储单元CPU缓存结构CPU读取存储器数据过程CPU为何要有高速缓存带有高速缓存的CPU执行计算的流程CPU运行安全等级操作系统内存管理内核线程模型 (KLT)用户线程模型冯诺依曼计算机模型计算机五大核心组成部分**控制器、运算器、存储器、输入、输出 **控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。运算器(D原创 2020-09-01 23:51:03 · 9872 阅读 · 0 评论