多线程进阶
头发还长的程序员
这个作者很懒,什么都没留下…
展开
-
(三十五)J.U.C之collections框架:DelayQueue
一、DelayQueue简介DelayQueue是JDK1.5时,随着J.U.C包一起引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于已有的PriorityBlockingQueue实现:DelayQueue也是一种比较特殊的阻塞队列,从类声明也可以看出,DelayQueue中的所有元素必须实现Delayed接口:/** * 一种混合风格的接口,用来标记那些...原创 2020-03-19 17:38:23 · 95 阅读 · 0 评论 -
(三十四)J.U.C之collections框架:SynchronousQueue
SynchronousQueue是JDK1.5时,随着JUC包一起引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于栈和队列实现。没有看错,SynchronousQueue的底层实现包含两种数据结构——栈和队列。这是一种非常特殊的阻塞队列,它的特点简要概括如下:入队线程和出队线程必须一一匹配,否则任意先到达的线程会阻塞。比如ThreadA进行入队操作,在有其它线程执行出队...原创 2020-03-17 09:31:53 · 97 阅读 · 0 评论 -
(三十三)J.U.C之collections框架:PriorityBlockingQueue
PriorityBlockingQueue,是在JDK1.5时随着JUC包引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于堆实现:PriorityBlockingQueue是一种无界阻塞队列,在构造的时候可以指定队列的初始容量。具有如下特点:PriorityBlockingQueue与之前介绍的阻塞队列最大的不同之处就是:它是一种优先级队列,也就是说元素并不是以FIFO...原创 2020-03-17 09:31:43 · 115 阅读 · 0 评论 -
(三十二)J.U.C之collections框架:LinkedBlockingQueue
LinkedBlockingQueue是在JDK1.5时,随着JUC包引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于单链表实现。LinkedBlockingQueue是一种近似有界阻塞队列,为什么说近似?因为LinkedBlockingQueue既可以在初始构造时就指定队列的容量,也可以不指定,如果不指定,那么它的容量大小默认为Integer.MAX_VALUE。...原创 2020-03-17 09:31:34 · 88 阅读 · 0 评论 -
(三十一)J.U.C之collections框架:ArrayBlockingQueue
ArrayBlockingQueue是在JDK1.5时,随着JUC包引入的一种阻塞队列,它实现了BlockingQueue接口,底层基于数组实现。ArrayBlockingQueue是一种有界阻塞队列,在初始构造的时候需要指定队列的容量。具有如下特点:队列的容量一旦在构造时指定,后续不能改变; 插入元素时,在队尾进行;删除元素时,在队首进行; 队列满时,调用特定方法插入元素会阻塞线程;...原创 2020-03-17 09:31:24 · 113 阅读 · 0 评论 -
(三十)J.U.C之collections框架:BlockingQueue接口
ConcurrentLinkedQueue和ConcurrentLinkedDeque是以非阻塞算法实现的高性能队列,其使用场景一般是在并发环境下,需要“队列”/“栈”这类数据结构时才会使用;而“阻塞队列”通常利用了“锁”来实现,也就是会阻塞调用线程,其使用场景一般是在“生产者-消费者”模式中,用于线程之间的数据交换或系统解耦。BlockingQueue继承了Queue接口,提供了一些阻...原创 2020-03-17 09:31:14 · 92 阅读 · 0 评论 -
(二十九)J.U.C之collections框架:ConcurrentLinkedDeque
Queue是FIFO(先进后出),元素从队首入队,队尾出队。而Deque(double-ended queue)是一种双端队列,可以在任意一端入队和出队。ConcurrentLinkedDeque是JDK1.7时JUC包引入的一个集合工具类,在JDK1.7之前,除了Stack类外,并没有其它适合并发环境的“栈”数据结构。ConcurrentLinkedDeque作为双端队列,可以当做...原创 2020-03-17 09:31:02 · 87 阅读 · 0 评论 -
(二十八)J.U.C之collections框架:ConcurrentLinkedQueue
ConcurrentLinkedQueue是JDK1.5时随着JUC一起引入的一个支持并发环境的队列。底层基于链表实现。基于自旋+CAS实现。具体原理及使用示例请查看https://segmentfault.com/a/1190000016248143...原创 2020-03-17 09:30:48 · 71 阅读 · 0 评论 -
(二十七)J.U.C之collections框架:CopyOnWriteArraySet
也是基于“写时复刻”思想。具体原理及使用示例请查看https://segmentfault.com/a/1190000016214610原创 2020-03-17 09:30:38 · 89 阅读 · 0 评论 -
(二十六)J.U.C之collections框架:CopyOnWriteArrayList
大多数业务场景都是一种“读多写少”的情景,CopyOnWriteArrayList就是为适应这种场景而诞生的。运用了一种“写时复刻”的思想,当我们需要修改列表中的元素时,先将列表copy,然后在副本修改,修改完成后再将引用从原列表指向新列表。这样做的好处是读/写不会冲突,可以并发进行,读操作还是在原列表,写操作在新列表。仅仅当有多个线程同时进行写操作时,才会进行同步。该类存在的一...原创 2020-03-17 09:30:29 · 81 阅读 · 0 评论 -
(二十五)J.U.C之collections框架:ConcurrentSkipListSet
https://segmentfault.com/a/1190000016214450原创 2020-03-17 09:30:16 · 95 阅读 · 0 评论 -
(二十四)J.U.C之collections框架:ConcurrentSkipListMap
ConcurrentSkipListMap可以看成是并发版本的TreeMap,它是有序的,底层是一种类似跳表(Skip List)的结构。具体原理及使用示例请查看https://segmentfault.com/a/1190000016168566...原创 2020-03-16 09:40:51 · 144 阅读 · 0 评论 -
(二十三)J.U.C之collections框架:ConcurrentHashMap(2) 扩容
https://segmentfault.com/a/1190000016124883原创 2020-03-16 09:40:43 · 116 阅读 · 0 评论 -
(二十二)J.U.C之collections框架:ConcurrentHashMap(1) 原理
ConcurrentHashMap是在JDK1.5时,JUC引入的一个同步集合工具类,顾名思义,这是一个线程安全的HashMap。具体原理及使用示例请查看https://segmentfault.com/a/1190000016096542...原创 2020-03-16 09:40:36 · 84 阅读 · 0 评论 -
(二十一)J.U.C之synchronizer框架:Phaser
Phaser是JDK1.7开始引入的一个同步工具类,适用于一些需要分阶段的任务的处理。它的功能与CyclicBarrier和CountDownLatch有些类似,类似于一个多阶段的栅栏,并且功能更强大。具体原理及使用示例请查看https://segmentfault.com/a/1190000015979879...原创 2020-03-16 09:40:28 · 184 阅读 · 0 评论 -
(二十)J.U.C之synchronizer框架:Exchanger
Exchanger——交换器,是JDK1.5时引入的一个同步器,从字面上就可以看出,这个类的主要作用是交换数据。类似CyclicBarrier,Exchanger可以看成是一个双向栅栏,如下图Thread1到达栅栏后,会首先观察有没其他线程已经到达栅栏,如果没有就等待,如果有其它线程(Thread2)已经到达,就会以成对的方式交换各自携带的信息,因此Exchanger非常适用于两个线程...原创 2020-03-16 09:40:21 · 101 阅读 · 0 评论 -
(十九)J.U.C之synchronizer框架:Semaphore
Semaphore,又名信号量,这个类的作用有点类似于“许可证”。有时,我们因为一些原因需要控制同时访问共享资源的最大线程数量,比如出于系统的性能考虑需要限流,或者共享资源是稀缺资源,我们需要有一种办法能够协调各个线程,以保证合理的使用公共资源。Semaphore维护了一个许可集,其实就是一定数量的“许可证”。当有线程想要访问共享资源时,需要先获取(acquire)的许可;如果许可不够了,...原创 2020-03-16 09:40:13 · 154 阅读 · 0 评论 -
(十八)J.U.C之synchronizer框架:CyclicBarrier
CyclicBarrier是一个辅助同步器类,在JDK1.5时随着JUC一起引入。跟CountDownLatch有些类似,CyclicBarrier可以认为是一个栅栏,栅栏的作用就是阻挡前行。顾名思义,CyclicBarrier是一个可以循环使用的栅栏:让线程到达栅栏时被阻塞(调用await方法),直到到达栅栏的线程数满足指定数量要求时,栅栏才会打开放行。这其实有点像军训报数...原创 2020-03-16 09:40:04 · 90 阅读 · 0 评论 -
(十七)J.U.C之synchronizer框架:CountDownLatch
CountDownLatch是一个辅助同步器类,用来做计数使用,它的作用有点类似于生活中的倒数计数器,先设定一个计数初始值,当计数降到0时,将会触发一些事件,如火箭的倒计时等。初始计数值在构造CountDownLatch对象时传入,每调用一次countDown方法,计数值就会减1。线程可以调用CountDownLatch的await方法进行阻塞,当计数值降到0时,所有之前调用a...原创 2020-03-16 09:39:55 · 92 阅读 · 0 评论 -
(十六)J.U.C之atomic框架:LongAdder
JDK1.8时,java.util.concurrent.atomic包中提供了一个新的原子类:LongAdder。根据Oracle官方文档的介绍,LongAdder在高并发的场景下会比它的前辈AtomicLong具有更好的性能,代价是消耗更多的内存空间。引入这个类的原因是,在并发量很高的情况下,自旋CAS会出现大量失败并不断自旋的情况,此时AtomicLong的自旋会成为瓶颈。而...原创 2020-03-16 09:39:44 · 142 阅读 · 0 评论 -
(十五)J.U.C之atomic框架:FieldUpdater
一、简介在java.util.concurrent.atomic包中,有三个比较特殊的原子类:AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater。通过名称可以看到,这几类的功能大致相同,只是针对的类型有所不同。所谓AtomicXXXFieldUpdater,就是可以以一种线程安全的方式...原创 2020-03-16 09:39:28 · 116 阅读 · 0 评论 -
(十四)J.U.C之atomic框架:Atomic数组
一、简介Atomic数组,顾名思义,就是能以原子的方式,操作数组中的元素。JDK提供了三种类型的原子数组:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray。这三种类型大同小异,AtomicIntegerArray对应AtomicInteger,AtomicLongArray对应AtomicLong,AtomicReferen...原创 2020-03-15 10:41:25 · 140 阅读 · 0 评论 -
(十三)J.U.C之atomic框架:AtomicReference
一、简介AtomicReference,顾名思义,就是以原子方式更新对象引用。AtomicReference持有一个对象的引用——value,并通过Unsafe类来操作该引用:为什么需要AtomicReference?难道多个线程同时对一个引用变量赋值也会出现并发问题?引用变量的赋值本身没有并发问题,也就是说对于引用变量var,类似下面的赋值操作本身就是原子操作:Foo v...原创 2020-03-15 10:31:15 · 281 阅读 · 0 评论 -
(十二)J.U.C之atomic框架:AtomicInteger
一、简介AtomicInteger类,应该是atomic框架中用得最多的原子类了。顾名思义,AtimicInteger是Integer原型的线程安全原子类,可以在应用程序中以原子的方式更新int值。1.创建AtomicInteger提供了两个构造器,使用默认构造器时,内部int类型的value值为0:AtomicInteger atomicInt = new AtomicIn...原创 2020-03-15 10:07:07 · 155 阅读 · 0 评论 -
(十一)J.U.C之atomic框架:Unsafe类
一、简介在正式的开讲juc-atomic框架系列之前,有必要先来了解下java中的unsafe类。Unsafe类,来源于sun.misc包。该类封装了许多类似指针操作,可以直接进行内存管理、操纵对象、阻塞/唤醒线程等操作。Java本身不直接支持指针的操作,所以这也是该类命名为Unsafe的原因之一。JUC中的需要CAS方法,内部其实都是Unsafe类在操作。比如AtomicBool...原创 2020-03-15 09:53:15 · 92 阅读 · 0 评论 -
(十)J.U.C之locks框架:StampedLock
一、简介StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时时读写锁之间可以互相转换,更细粒度控制并发。首先明确下,该类的设计初衷是作为一个内部工具类,用于辅助开发其他线程安全组件,用得好,该类可以提升系统性能,用不好,容易产生死锁和其它莫名其妙的问题。1.1StampedL...原创 2020-03-15 09:42:50 · 96 阅读 · 0 评论 -
(九)J.U.C之locks框架:基于AQS的读写锁(5)
https://segmentfault.com/a/1190000015807600原创 2020-03-15 09:27:22 · 63 阅读 · 0 评论 -
(八)J.U.C之locks框架:AQS共享功能剖析(4)
https://segmentfault.com/a/1190000015807573原创 2020-03-15 09:26:49 · 48 阅读 · 0 评论 -
(七)J.U.C之locks框架:AQS的Condition等待(三)
https://segmentfault.com/a/1190000015807209原创 2020-03-15 09:26:20 · 65 阅读 · 0 评论 -
(六)J.U.C之locks框架:AQS独占功能剖析(二)
https://segmentfault.com/a/1190000015804888原创 2020-03-15 09:25:29 · 93 阅读 · 0 评论 -
(五)J.U.C之locks框架:AQS综述(一)
https://segmentfault.com/a/1190000015562787原创 2020-03-15 09:24:32 · 116 阅读 · 0 评论 -
(四)J.U.C之locks框架:LockSupport
一、LockSupport类简介LockSupport类,是JUC包中的一个工具类,是用来创建锁和其它同步类的基本线程阻塞原语。(Basic thread blocking primitives for creating locks and other synchronized classes)LockSupport类的核心方法其实就两个:park()和unpark(),其中park()方...原创 2020-03-11 15:53:30 · 108 阅读 · 0 评论 -
(三)J.U.C之locks框架:ReentrantReadWriteLock
一、ReentrantReadWriteLock类简介ReentrantReadWriteLock类,顾名思义,是一种读写锁,它是ReadWriteLock接口的直接实现,该类在内部实现了具体独占锁特点的写锁,以及具有共享锁特点的读锁,和ReentrantLock一样,ReentrantReadWriteLock类也是通过定义内部类实现AQS框架的API来实现独占/共享的功能。Ree...原创 2020-03-11 14:59:04 · 96 阅读 · 0 评论 -
(二)J.U.C之locks框架:ReentrantLock
一、ReentrantLock类简介ReentrantLock类实现了Lock接口,是一种可重入的独占锁,它具有与使用synchronized相同的一些基本行为和语义,但功能更强大。ReentrantLock内部通过内部类实现了AQS框架(AbstractQueuedSynchronizer)的API来实现独占锁的功能。1.1类声明ReentrantLock类直接实现了Lock接...原创 2020-03-11 11:55:11 · 91 阅读 · 0 评论 -
(一)J.U.C之locks框架:接口
本系列文章中所说的juc-locks锁框架就是值java.util.concurrent.locks包,该包提供了一系列基础的锁工具,用以对synchronized、wait、notify等进行补充、增强。juc-locks框架中一共就三个接口:Lock、Condition、ReadWriteLock。一、Lock接口简介Lock接口可以视为synchronized的增强版...原创 2020-03-11 11:24:28 · 163 阅读 · 0 评论