
【J.U.C源码】
文章平均质量分 94
J.U.C核心源码解析,使用场景分析
小小工匠
show me the code ,change the world
展开
-
J.U.C - 深入解读阻塞队列实现原理&源码
“生产者-消费者”模式简化了开发流程,消除了“生产者”和“消费者”对代码实现的依赖,生产者只需将生成的数据放入队列中,而不需要知道由谁消费以及何时和如何消费,同样消费者也不需要知道数据是谁生产的,这样就实现了将“生产者”和“消费者”两者操作解耦。在JUC中,线程池本质上就是一个“生产者-消费者”模式的实现,提交任务的线程是生产者,线程池中线程是消费者,在线程池中当提交的任务不能被立即执行的时候,线程池就会将提交的任务放到一个阻塞的任务队列中。此时队列是满的,如果继续插入元素,put线程会被阻塞。原创 2024-11-16 18:10:53 · 3873 阅读 · 0 评论 -
J.U.C - 深入解读Condition条件变量原理&源码
配合synchronized同步锁在同步代码块中调用加锁对象notify和wait方法,可以实现线程间同步,在JUC锁里面也有相似的实现:Condition类,利用条件变量Condition的signal和await方法用来配合JUC锁也可以实现多线程之间的同步。和synchronized不同的是,一个synchronized锁只能用一个共享变量(锁对象)的notify或wait方法实现同步,而AQS的一个锁可以对应多个条件变量,对线程的等待、唤醒操作更加详细和灵活。原创 2024-11-16 12:18:26 · 3606 阅读 · 0 评论 -
J.U.C - 深入解析ReentrantLock原理&源码
Java提供了种类丰富的锁,synchronized为Java的关键字,是Java最早提供的同步机制。当它用来修饰一个方法或一个代码块时,能够保证在同一时刻最多只能有一个线程执行该代码。当使用synchronized修饰代码时,并不需要显式的执行加锁和解锁过程,所以它也被称之为隐式锁。原创 2024-11-14 21:53:24 · 4447 阅读 · 0 评论 -
J.U.C - 基础工具类:LockSupport类
LockSupport是 Java 并发包中的一个工具类,主要用于线程的阻塞和唤醒操作。它提供了一种非常底层且高效的机制来实现线程间的同步。类是Java 1. 6引入的一个工具类,所有的方法都是静态方法。它主要提供了可以使线程阻塞和唤醒的方法,它是JUC中锁和其他并发类实现的基础。核心方法都是基于Unsafe类里的park和unpark两个方法实现的。原创 2024-11-13 19:39:53 · 3271 阅读 · 0 评论 -
J.U.C - 基础工具类:Unsafe类
Java不能像C/C++一样直接操作内存区域,需要通过本地方法的方式来操作内存区域。JDK可以通过一个“后门”——Unsafe类,执行底层硬件级别的CAS原子操作,线程阻塞和唤醒等。Unsafe类是 Java 中一个非常特殊的类,它提供了硬件级别的原子操作和直接内存访问等功能。Unsafe类中的方法几乎全部都是native方法,它们使用JNI的方式调用本地的C++类库。由于其强大的功能和潜在的风险,Unsafe类并未公开暴露给普通开发者,而是被隐藏在sun.misc包中。原创 2024-11-13 19:31:53 · 3812 阅读 · 0 评论 -
J.U.C - 线程池原理&源码解析
线程并不是越多越好,线程数量和系统性能是一种抛物线的关系,当线程数量达到某个数值的时候,性能反而会降低很多,因此对线程的管理,尤其是数量的控制能直接决定程序的性能。内存:当线程数量一大,线程的创建和运行消耗内存是巨大的,甚至有可能超过服务器的承受范围,导致的内存溢出问题。. 比如,线程池可以根据任务执行情况,动态的调整线程池中的工作线程的数量。所谓线程池,通俗的理解即一个容器,里面存放着提前创建好的若干个线程,当有任务提交给线程池执行时,任务会被分配给容器中的某个线程来执行。原创 2024-11-12 22:21:29 · 4041 阅读 · 0 评论 -
Java Review - ArrayList 源码解读
文章目录概述方法的执行效率概述从类的继承图上我们可知道,ArrayList实现了List接口。同时List是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,ArrayList底层基于数组实现。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器自动扩容。ArrayList<E>,可以看到是泛型类型, Java泛型只是编译器提供的语法原创 2021-11-14 09:48:55 · 26789 阅读 · 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 · 27083 阅读 · 0 评论 -
Java Review - 并发编程_原子操作类原理剖析
JUC包提供了一系列的原子性操作类,这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作这在性能上有很大提高。由于原子性操作类的原理都大致相同,我们以AtomicLong类的实现原理为例,并探讨JDK8新增的 LongAdder和LongAccumulator类的原理。原创 2021-11-29 00:10:45 · 30022 阅读 · 0 评论 -
Java Review - 并发编程_原子操作类LongAdder & LongAccumulator剖析
Java Review - 并发编程_原子操作类原理剖析中提到了 AtomicLong通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说它的性能已经很好了,但是JDK开发组并不满足于此。使用AtomicLong时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS操作会成功,这就造成了大量线程竞争失败后,会通过无限循环不断进行自旋尝试CAS的操作,而这会白白浪费CPU资源。原创 2021-11-30 22:58:01 · 29600 阅读 · 0 评论 -
Java Review - 并发编程_并发List_CopyOnWriteArrayList源码剖析
文章目录概述概述并发包中的并发List只有CopyOnWriteArrayList。CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略。...原创 2021-12-01 00:16:15 · 29863 阅读 · 0 评论 -
Java Review - 并发编程_LockSupport
位于rt.jar包的java.util.concurrent.locks目录中, 主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。原创 2021-12-01 20:18:27 · 30104 阅读 · 0 评论 -
Java Review - 并发编程_独占锁ReentrantLock原理&源码剖析
ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞而被放入该锁的AQS阻塞队列里面。类图结构如下底层基于AQS实现,ReentrantLock的lock等方法,委托给其依赖sync的lock方法AQS 是典型的模板方法设计模式,父类(AQS)定义好骨架和内部操作细节,具体规则由子类去实现从类图可以看出,ReentrantLock最终还是使用AQS来实现的,并且根据参数来决定其内部是一个公平还是非公平锁,默认是非公平锁。/***//***/原创 2021-12-04 11:44:02 · 30442 阅读 · 1 评论 -
Java Review - 并发编程_读写锁ReentrantReadWriteLock的原理&源码剖析
解决线程安全问题使用ReentrantLock就可以,但是ReentrantLock是独占锁,某时只有一个线程可以获取该锁,而实际中会有写少读多的场景,显然ReentrantLock满足不了这个需求,所以ReentrantReadWriteLock应运而生。ReentrantReadWriteLock采用读写分离的策略,允许多个线程可以同时获取读锁。为了了解ReentrantReadWriteLock的内部构造,我们先看下它的类图结构读写锁的内部维护了一个ReadLock和一个WriteLock,它们依赖原创 2021-12-04 16:46:57 · 30583 阅读 · 1 评论 -
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 · 30866 阅读 · 1 评论 -
Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析
JDK中提供了一系列场景的并发安全队列。总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列,阻塞队列使用锁实现非阻塞队列则使用CAS非阻塞算法实现ConcurrentLinkedQueue的底层使用单向链表数据结构来保存队列元素,每个元素被包装成一个Node节点。队列是靠头、尾节点来维护的,创建队列时头、尾节点指向一个item为null的哨兵节点。第一次执行peek或者first操作时会把head指向第一个真正的队列元素。原创 2021-12-05 08:48:21 · 31086 阅读 · 1 评论 -
Java Review - 并发编程_StampedLock锁探究
StampedLock是并发包里面JDK8版本新增的一个锁,该锁提供了三种模式的读写控制, 当调用获取锁的系列函数时,会返回一个long 型的变量,我们称之为戳记(stamp),这个戳记代表了锁的状态。其中try系列获取锁的函数,当获取锁失败后会返回为0的stamp值。当调用释放锁和转换锁的方法时需要传入获取锁时返回的stamp值。原创 2021-12-05 13:22:26 · 30999 阅读 · 0 评论 -
Java Review - 并发编程_LinkedBlockingQueue原理&源码剖析
文章目录概述类图结构主要方法offer操作概述Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析介绍了使用CAS算法实现的非阻塞队列ConcurrentLinkedQueue,下面我们来介绍使用独占锁实现的阻塞队列LinkedBlockingQueue类图结构首先看一下LinkedBlockingQueue的类图结构,以便从全局对LinkedBlockingQueue有个直观的了解主要方法offer操作...原创 2021-12-05 15:37:37 · 33594 阅读 · 0 评论 -
Java Review - 并发编程_ArrayBlockingQueue原理&源码剖析
Java Review - 并发编程_LinkedBlockingQueue原理&源码剖析介绍了使用有界链表方式实现的阻塞队列LinkedBlockingQueue,这里我们继续来研究使用有界数组方式实现的阻塞队列ArrayBlockingQueue的原理。原创 2021-12-05 19:17:27 · 33702 阅读 · 0 评论 -
Java Review - 并发编程_PriorityBlockingQueue原理&源码剖析
PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素。其内部是使用平衡二叉树堆实现的,所以直接遍历队列元素不保证有序。默认使用对象的compareTo方法提供比较规则,如果你需要自定义比较规则则可以自定义comparators。原创 2021-12-05 23:44:47 · 33841 阅读 · 0 评论 -
Java Review - 并发编程_DelayQueue原理&源码剖析
DelayQueue并发队列是一个无界阻塞延迟队列,队列中的每个元素都有个过期时间,当从队列获取元素时,只有过期元素才会出队列。队列头元素是最快要过期的元素。原创 2021-12-05 23:48:52 · 34237 阅读 · 0 评论 -
Java Review - 并发编程_ThreadPoolExecutor原理&源码剖析
文章目录线程池主要解决两个问题线程池主要解决两个问题一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,而线程的创建和销毁是需要开销的。线程池里面的线程是可复用的,不需要每次执行异步任务时都重新创建和销毁线程。二是线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等。每个ThreadPoolExecutor也保留了一些基本的统计数据,比如当前线程池完成的任务数目等。另外,线程池也提供了许多可调参数原创 2021-12-11 09:34:12 · 35054 阅读 · 0 评论 -
Java Review - 并发编程_ScheduledThreadPoolExecutor原理&源码剖析
Java Review - 并发编程_ThreadPoolExecutor原理&源码剖析我们复习了Java中线程池ThreadPoolExecutor的原理,ThreadPoolExecutor只是Executors工具类的一部分功能。下面来介绍另外一部分功能,也就是ScheduledThreadPoolExecutor的实现,这是一个可以在指定一定延迟时间后或者定时进行任务调度执行的线程池。原创 2021-12-11 14:46:35 · 34340 阅读 · 0 评论 -
Java Review - 并发编程_ CountDownLatch原理&源码剖析
否则执行代码(2)使用CAS将计数器值减1,CAS失败则循环重试,否则如果当前计数器值为0则返回true,返回true说明是最后一个线程调用的countdown方法,那么该线程除了让计数器值减1外,还需要唤醒因调用CountDownLatch的await方法而被阻塞的线程,具体是调用AQS的doReleaseShared方法来激活阻塞的线程。线程调用该方法后,计数器的值递减,递减后如果计数器值为0则唤醒所有因调用await方法而被阻塞的线程,否则什么都不做。原创 2021-12-11 19:43:44 · 34719 阅读 · 0 评论 -
Java Review - 并发编程_ 回环屏障CyclicBarrier原理&源码剖析
多个线程之间是相互等待的,假如计数器值为N,那么随后调用await方法的N-1个线程都会因为到达屏障点而被阻塞,当第N个线程调用await后,计数器值为0了,这时候第N个线程才会发出通知唤醒前面的N-1个线程。当第一个获取锁的线程由于被阻塞释放锁后,被阻塞的9个线程中有一个会竞争到lock锁,然后执行与第一个线程同样的操作,直到最后一个线程获取到lock锁,此时已经有9个线程被放入了条件变量trip的条件队列里面。一开始计数器值为2,当第一个线程调用await方法时,计数器值会递减为1。原创 2021-12-12 11:02:30 · 34687 阅读 · 0 评论 -
Java Review - 并发编程_ 信号量Semaphore原理&源码剖析
文章目录概述小Demo概述Semaphore信号量也是Java中的一个同步器,与CountDownLatch和CycleBarrier不同的是,它内部的计数器是递增的,并且在一开始初始化Semaphore时可以指定一个初始值,但是并不需要知道需要同步的线程个数,而是在需要同步的地方调用acquire方法时指定需要同步的线程个数。小Demo...原创 2021-12-12 15:59:09 · 34892 阅读 · 1 评论 -
[并发编程] - Executor框架#ThreadPoolExecutor源码解读03
文章目录PrePre[并发编程] - Executor框架#ThreadPoolExecutor源码解读02说了一堆结论性的东西,作为开发人员着实是不过瘾,那这里我们就来剖根问底来看下线程池是如何工作的。原创 2020-09-08 00:12:02 · 14799 阅读 · 0 评论 -
[并发编程] - Executor框架#ThreadPoolExecutor源码解读02
文章目录Pre线程池的具体实现线程池的创建参数解读corePoolSizemaximumPoolSizekeepAliveTimeunitworkQueuethreadFactoryhandler任务提交方式一 提交任务无返回值方式二 提交任务有返回值线程池监控PreJava-Java中的线程池原理分析及使用[并发编程] - Executor框架#ThreadPoolExecutor源码解读01线程池的具体实现主要两大类ThreadPoolExecutorScheduledTh原创 2020-09-02 02:54:41 · 14831 阅读 · 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 · 15074 阅读 · 0 评论 -
[并发编程] - 操作系统底层工作原理
文章目录冯诺依曼计算机模型CPU内部结构控制单元控制单元存储单元CPU缓存结构CPU读取存储器数据过程CPU为何要有高速缓存带有高速缓存的CPU执行计算的流程CPU运行安全等级操作系统内存管理内核线程模型 (KLT)用户线程模型冯诺依曼计算机模型计算机五大核心组成部分**控制器、运算器、存储器、输入、输出 **控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。运算器(D原创 2020-09-01 23:51:03 · 15029 阅读 · 0 评论