![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC源码剖析
Demo_zfs
这个作者很懒,什么都没留下…
展开
-
多线程并发编程20-线程同步之CyclicBarrier
前文介绍了使用CountDownLatch来实现线程间同步,但是CountDownLatch的计数器是一次性的,当计数器值减到0之后再调用await或countdown方法就会立刻返回。今天讲解的CyclicBarrier是一种可重置的线程间同步,当指定个数的线程全部到达了一个状态后再全部同时执行,并重置CyclicBarrier。 下面通过一个代码示例介绍CountDownLa...原创 2020-04-18 00:03:23 · 175 阅读 · 0 评论 -
多线程并发编程19-线程同步之CountDownLatch
说到线程同步第一个想到的一定是Thread类的join方法,当需要等待一个线程执行结束之后再接着执行本线程接下去的逻辑,join经常会在这种场景下被使用,但是join方法是Thread类的方法,需要使用Thread类实例进行调用,不够灵活,不能满足不同场景的需求,例如使用线程池来管理线程的时,一般直接添加Runnable到线程池,这个时候就没办法再调用线程的join方法,而接下来要介绍的C...原创 2020-04-08 22:35:28 · 532 阅读 · 0 评论 -
多线程并发编程18-定时线程池ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor是一个可以指定一定延迟时间后或者定时进行任务调度执行的线程池,继承于ThreadPoolExecutor,关于ThreadPoolExecutor的介绍请查看前面文章。因为继承于ThreadPoolExecutor,所以ScheduledThreadPoolExecutor内部也有如下参数:corePoolSize:线程池核...原创 2020-04-05 21:41:51 · 878 阅读 · 0 评论 -
多线程并发编程17-线程池ThreadPoolExecutor源码剖析
今天来说一说线程池ThreadPoolExecutor,线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,而线程的创建和销毁都需要开销。线程池中的线程是可以复用的,不需要每次执行异步任务都进行创建线程,从而减少了开销。二是线程池提供了一种资源限制和管理的手段,例如限制线程的个数、动态增加线程的个数、缓...原创 2020-04-05 21:40:59 · 220 阅读 · 0 评论 -
多线程并发编程16-并发队列总结
前面介绍了5种并发队列的原理,ConcurrentLinkedQueue、LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue和DelayQueue。下面横向的对比一下这5中并发队列的异同。 ConcurrentLinkedQueue是非阻塞无界的双向FIFO队列,ConcurrentLinkedQueue是5个...原创 2020-04-04 15:08:35 · 185 阅读 · 0 评论 -
多线程并发编程15-DelayQueue源码剖析
今天来说一说DelayQueue,DelayQueue并发队列是一个无界阻塞延迟队列,队列中的每个元素都有一个过期时间,当从队列获取元素时,只有过期元素才会出队列,不允许存放null元素。队列头元素是最快要过期的元素。 DelayQueue内部有一个PriorityQueue优先队列,存入到该队列的元素都实现Delayed接口,由于每个原始都有一个过期时间,所以要实现获取当前元素...原创 2020-04-04 15:07:22 · 153 阅读 · 0 评论 -
多线程并发编程14-PriorityBlockingQueue源码剖析
PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或最低的元素。其内部使用平衡二叉树堆实现的,所以遍历队列元素不能保证有序性。默认使用对象的compareTo方法进行比较,也可以自定义comparators。 PriorityBlockingQueue内部有一个数组用来存放队列元素,在前面介绍的ArrayBlockingQueue类中也有...原创 2020-03-23 21:26:44 · 189 阅读 · 0 评论 -
多线程并发编程13-ArrayBlockingQueue源码剖析
前面一文介绍了有界链表阻塞队列LinkedBlockingQueue,今天来说一说有界数组阻塞队列ArrayBlockingQueue。 ArrayBlockingQueue类中的常用方法和前文介绍的LinkedBlockingQueue类常用方法一样,内部源码实现也大同小异。ArrayBlockingQueue类初始化一个固定大小的数组items,使用ReentrantLock...原创 2020-03-23 21:25:40 · 125 阅读 · 0 评论 -
多线程并发编程12-LinkedBlockingQueue源码剖析
前面的文章介绍了使用CAS算法实现的非阻塞有界队列ConcurrentLinkedQueue,今天介绍另一个并发队列LinkedBlockingQueue。 LinkedBlockingQueue是一个阻塞有界的队列,使用单链表实现,和ConcurrentLinkedQueue一样也有两个Node,分别存放首、尾节点,并且还有一个初始值为0的原子变量count,用来记录队列元素个...原创 2020-03-22 20:23:23 · 252 阅读 · 0 评论 -
多线程并发编程11-ConcurrentLinkedQueue源码剖析
今天来说一说ConcurrentLinkedQueue类,ConcurrentLinkedQueue类是线程安全的非阻塞无界的FIFIO队列,通过CAS算法进行入队和出队。 ConcurrentLinkedQueue类中主要的成员变量如下:private transient volatile Nodehead; //内部双向列表的头节点,volatile保证内存可见性。...原创 2020-03-22 20:20:37 · 166 阅读 · 0 评论 -
多线程并发编程10-CopyOnWriteArrayList源码剖析
今天来说一说CopyOnWriteArrayList类,纵观JUC包下并发List只有CopyOnWriteArrayList类。CopyOnWriteArrayList是一个线程安全的ArrayList,从它的命名也能看出在进行写操作的时候会进行复制,这种写时复制策略会产生弱一致性问题。下面对CopyOnWriteArrayList类继续剖析。 在CopyOnWriteArra...原创 2020-03-18 22:49:37 · 693 阅读 · 0 评论 -
多线程并发编程9-ReentrantReadWriteLock源码剖析
前面文章说到了ReentrantLock,解决线程间安全问题,使用ReentrantLock就可以,但是ReentrantLock是独占锁,某一个时刻只能一个线程获取锁,在写少读多的场景下,显然ReentrantLock并不能满足次场景。今天要说的ReentrantReadWriteLock锁就能满足写少读多的场景。 ReentrantReadWriteLock锁采用读写分离的策...原创 2020-03-18 22:48:58 · 112 阅读 · 0 评论 -
多线程并发编程8-ReentrantLock源码剖析
今天来说一说ReentrantLock类。ReentrantLock是可重入的独占锁,同时只能有一个线程获取该锁,其他获取该锁的线程就会被阻塞挂起。 ReentrantLock内部最为核心的就是Sync实例,内部类Sync继承AbstractQueuedSynchronizer,又根据公平锁还是非公平锁实现对应的FairSync类和NonfairSync类。ReentrantLo...原创 2020-03-17 23:10:05 · 136 阅读 · 0 评论 -
多线程并发编程7-AQS源码剖析
今天来说一说AQS,是AbstractQueuedSynchronizer抽象同步队列的简称。AbstractQueuedSynchronizer类是实现同步器的基础组件,并发包中的锁的底层使用的就是AQS。AbstractQueuedSynchronizer类中的唤醒和挂起是用的LockSupport类,并添加了一些别的参数,上层不同的锁机制以及同步机制就是对这些新增的参数进行不同的操作...原创 2020-03-17 23:07:52 · 152 阅读 · 0 评论 -
多线程编发编程6-LockSupport源码剖析
今天来说一说LockSupport类,为什么要说该类呢?因为这LockSupport类是锁和同步类的基础,它提供线程的挂起和唤醒。其实从源码中也可以看到LockSupport只是多Unsafe类的park系列方法和unpark系列方法进行了一层浅浅的封装。 LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类方法的线程是不持有许可...原创 2020-03-15 22:48:44 · 111 阅读 · 0 评论 -
多线程并发编程5-ThreadLocalRandom类源码剖析
今天来说一说ThreadLocalRandom类,ThreadLocalRandom类是juc包下的随机数生成器,它弥补了Random类的不足。下面介绍Random的源码实现、Random存在的问题以及ThreadLocalRandom是如何优化Random存在的缺陷的。Random Random类是一个使用广泛的随机生成工具类,下面的代码相信大家一定不陌生,Rando...原创 2020-03-15 22:47:40 · 248 阅读 · 0 评论 -
多线程并发编程4-原子操作类源码剖析
今天来讲一讲原子操作类,JUC包提供了一系列的原子性操作类,这些操作类使用的是CAS非阻塞算法实现的,相比于锁,原子性的操作性能有更大的提升。各个原子操作类的实现原理都大同小异,今天就拿AtomicLong类进行讲解。除了讲解AtomicLong类之后还会讲解JDK8新增的原子操作类LongAdder.AtomicLong 从AtomicLong类中的源码可以看出来,Atom...原创 2020-03-14 17:19:57 · 173 阅读 · 0 评论 -
多线程并发编程3-锁类型
本文来说一说锁的各个类型以及之间的差异。乐观锁与悲观锁 乐观锁和悲观锁是在数据库中引入的名词,但在java的并发锁中也使用了乐观锁和悲观锁的思想。 乐观锁,认为数据在一般情况下不会造成冲突,所以在对数据进行读操作的时候不会加排它锁,而是在进行数据写的时候,才会对数据冲突与否进行检测,也就是加排他锁。由于乐观锁是在提交时才锁定,所以不会产生任何死锁。juc中CopyO...原创 2020-03-14 17:16:35 · 111 阅读 · 0 评论 -
多线程并发编程2-基础2
并发与并行 本文抛出的第一个问题就是何为并发?何为并行?并发,是指同一时间段多个任务同时都在执行,并都没有结束。经常有听到TPS/QPS这些指的就是每秒的并发的响应数/请求数。并行,是指在单位时间内多个任务同时在执行。 在以前的单CPU时代多线程并发并没有什么意义,因为单个CPU同一个单位时间只能执行一个任务,其余为被执行的任务就需要被挂起,这就导致线程间频繁的上下文切换带来了...原创 2020-03-14 17:14:24 · 278 阅读 · 0 评论 -
多线程并发编程1-基础1
线程与进程多线程,首先第一个会问的就是什么是线程?什么是进程?进程是代码在数据集合上的一次运行运动,是系统进行资源分配和调度的基本单位。线程是进程中的一个执行路径,一个进程中至少有一个线程(main),进程中的多个线程共享进程的资源。关于操作系统的资源分配这里多说一句,操作系统是把资源分配给进程的,但是CPU资源比较特殊,它是直接分配给线程的。线程的生命周期...原创 2020-03-13 22:14:21 · 139 阅读 · 0 评论