JUC 并发工具集
详细介绍JUC下的类的作用及实例演示.
securitit
由上至下深入
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CountDownLatch 深入源码解析
CountDownLatch是一个同步工具类,用来多线程协作的帮助工具类。 CountDownLatch依赖一计数器实现同步,可以使线程完成任务后进入阻塞状态,每个线程执行完任务后递减计数器,计数器归零后,阻碍的线程被唤醒继续执行任务。 演示示例:package com.securitit.serialize.juc;import java.util.concurrent.CountDownLatch;public class CountDownLatchTester { // Co原创 2020-06-27 16:54:42 · 7669 阅读 · 0 评论 -
TimeUnit 深入源码解析
TimeUnit是JUC包下提供的一个枚举类,表示给定单元粒度的时间段。 演示示例: 首先,我们先看一个示例,示例中包含了TimeUnit的所有功能。package com.securitit.serialize.juc;import java.util.Date;import java.util.concurrent.TimeUnit;import org.assertj.core.util.DateUtil;public class TimeUnitTester { pu原创 2020-06-27 16:47:54 · 8425 阅读 · 0 评论 -
Phaser 介绍及应用详解
Phaser是JDK提供的同步辅助类,用来解决多线程间分阶段同步完成任务的工具类。其和CountDownLatch、CyclicBarrier功能类似,但Phaser提供了更加丰富的功能,使用上更加灵活。 演示示例:package com.securitit.serialize.juc;import java.util.Date;import java.util.concurrent.Phaser;import org.assertj.core.util.DateUtil;publi原创 2020-06-27 16:45:20 · 8231 阅读 · 1 评论 -
CyclicBarrier 深入源码解析
CyclicBarrier意为“循环栅栏”,是一个可循环利用的屏障。CyclicBarrier可以使指定数量线程到达阻塞点后继续后续任务。 演示示例: 首先,新建一个线程类,用于模拟多线程环境。package com.securitit.serialize.juc;import java.util.concurrent.CyclicBarrier;public class CyclicBarrierThread extends Thread { // CyclicBarrier实例.原创 2020-06-27 16:44:09 · 8149 阅读 · 2 评论 -
Semaphore 深入源码解析
Semaphore(信号量),内部维护了一组许可证,通过acquire、tryAcquire方法获取许可证,acquire获取不到许可时,会阻塞线程。tryAcquire获取不到许可时,会返回获取结果。通过release释放许可,释放许可会添加可用许可证数量。Semaphore借助AQS实现的共享锁,通过构造参数可以给状态变量赋值,用来控制对资源访问的并发度。 演示示例:package com.securitit.serialize.juc;import java.util.Date;imp原创 2020-06-27 16:42:14 · 8123 阅读 · 0 评论 -
Exchanger 介绍及应用详解
Exchanger用于线程间进行通信、数据交换。Exchanger提供了一个同步点exchange方法,两个线程调用exchange方法时,无论调用时间先后,两个线程会互相等到线程到达exchange方法调用点,此时两个线程可以交换数据,将本线程产出数据传递给对方。 演示示例:package com.securitit.serialize.juc;import java.util.concurrent.Exchanger;public class ExchangerTester { /原创 2020-06-27 16:39:50 · 12164 阅读 · 1 评论 -
LockSupport 深入源码解析
LockSupport是一个线程工具类,所有的方法都是静态方法,可以在线程任意位置阻塞、唤醒线程。LockSupport的功能是依赖Unsafe类实现的。 演示示例:package com.securitit.serialize.locks;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.LockSupport;public class LockSupportTester { public原创 2020-06-27 16:38:18 · 7742 阅读 · 0 评论 -
Condition 深入源码解析
java.lang.Object提供了wait()、notify()/notifyAll(),通过wait()可以使当前线程释放持有的锁,进行等待状态,通过notify()/notifyAll()可以使唤醒当前线程,其可以对锁资源进行竞争。 在JUC提供的锁实现中,通过java.util.concurrent.locks.Conidtion提供了类似实现,可以完成线程的等待和唤醒。 演示示例: 首先,新建两个线程,一个用于演示线程等待,一个用于演示线程唤醒。package com.secu原创 2020-06-27 16:36:32 · 7852 阅读 · 0 评论 -
StampedLock 应用及原理详解
从synchronized到ReentrantLock,从ReentrantLock到ReentrantReadWriteLock,都在尽量减少锁带来的负面影响。 · synchronized:语言级别支持,使用简单,但缺少灵活性,且不可中断。 · ReentrantLock:JUC提供,使用相对复杂,但是可灵活控制锁的获得和释放,可中断。 · ReentrantReadWriteLock:实现了锁的分离,分为读锁和写锁,写写、写读互斥,读读可并发使用。 虽然synchronized、R原创 2020-06-23 14:31:15 · 8371 阅读 · 1 评论 -
ReentrantReadWriteLock 深入源码解析
ReentrantReadWriteLock是JUC提供的读写锁,在某些应用场景下,读操作要比写操作频繁的多,此时应该尽可能利用读写之间协作,减少共享资源的竞争。写操作读操作写操作禁止禁止读操作禁止允许 读写锁的三个重要特性: · 重入性:无论读锁和写锁都支持线程重入。 · 公平性:支持公平锁和非公平锁,默认是非公平锁,非公平锁吞吐量较高。 · 锁降级:线程在持有写锁时,可以获取读锁,然后释放写锁,最后释放读锁,这就是锁的降级。 · 锁升级:原创 2020-06-22 15:50:22 · 7703 阅读 · 0 评论 -
ReentrantLock 深入源码解析
ReentrantLock是JUC提供的可重入锁,与synchronized提供相似的功能,但是ReentrantLock和synchronized之间还是存在一些异同: · synchronized是独占锁,加解锁过程自动进行,易用但不灵活。ReentrantLock是JUC提供的独占锁,加解锁过程手动进行,不易用但灵活。 · ReentrantLock和synchronized均是重入锁,synchronized由于是语言级提供,不必担心加解锁的过程。ReentrantLock由于是JUC提原创 2020-06-22 15:47:02 · 7544 阅读 · 0 评论 -
AQS - AbstractQueuedSynchronizer 深入源码解析
AQS(AbstractQueuedSynchronizer)是JUC包下很多工具类的实现基础,它提供了一种实现阻塞锁和一系列依赖FIFO同步队列的框架。主要依赖一个int成员变量作为同步状态state,以及一个CLH同步队列,对于CLH同步队列,竞争资源同一时间只能被一个线程访问,CLH为管理等待锁的线程的队列。 AQS内部实现了独占锁和共享锁: · 独占锁:每次仅有一个线程能够持有,具有排他性质。 · 共享锁:允许多个线程持有锁,并发访问共享资源。 源码分析: AQS 节点定义:原创 2020-06-22 15:40:00 · 7503 阅读 · 0 评论 -
LongAdder、LongAccumulator、DoubleAdder、DoubleAccumulator 深入源码解析
LongAdder、LongAccumulator、DoubleAdder、DoubleAccumulator是JDK1.8提供的针对long和double的累加器实现,依赖于Striped64实现,LongAdder和DoubleAdder只针对数值的增减,LongAccumulator和DoubleAccumulator针对自定义函数的增减。 演示示例: 首先,新建一个线程类,负责模拟多线程环境下,对LongAdder、LongAccumulator、DoubleAdder、DoubleAc原创 2020-06-22 14:30:48 · 8346 阅读 · 0 评论 -
Striped64 深入源码解析
JUC在JDK1.8版本中引入了Striped64类及其四个实现类LongAdder、LongAccumulator、DoubleAdder、DoubleAccumulator,在原有的AtomicXXXXX等系列上,针对多线程并发情况进行了优化。 Striped64类被设计用来支持累加器的的并发组件,可以在多线程高并发环境下安全的累加计数。Striped64内部存储了base、cells数组和cellsBusy锁,计数线程首先会尝试使用CAS对base变量进行更改,若更新成功,则计数完成,此时累加原创 2020-06-18 23:50:33 · 8271 阅读 · 0 评论 -
AtomicMarkableReference、AtomicStampedReference 深入源码解析
正如《CAS 完全解析》所讲述一样,CAS可以使用无锁的方式在多线程环境下保证数据操作的安全性,但同时会引入ABA问题,什么是ABA问题呢,大概意思就是: 假设这里有一个变量V,有两个线程T1和T2。目前V的值是100,T1和T2并发对V进行修改,可能由于某种资源调度方面的原因,T1获得的资源比较充足,T1将V变更为200,然后又变更会100。此时,T2才获得CPU资源,T2得到V的值,T2发现V的值还是100,认为其没有变化,CAS比较通过,进行数据修改。这里就引发了经典的ABA的问题。V的值实际原创 2020-06-18 14:45:45 · 8258 阅读 · 0 评论 -
AtomicReference、AtomicReferenceArray、AtomicReferenceFieldUpdater 深入源码解析
本篇主要对AtomicReference、AtomicReferenceArray、AtomicReferenceFieldUpdater进行讲解,本博已经对AtomicInteger、AtomicIntegerArray、AtomicIntegerFieldUpdater源码进行了深入解析。其实这几个类原理都是类似的,不同的是针对的操作数据类型有差异。 演示示例: 首先,提供一个线程类,用来模拟多线程环境:package com.securitit.serialize.atomics;i原创 2020-06-18 14:43:21 · 8315 阅读 · 0 评论 -
AtomicLong、AtomicLongArray、AtomicLongFieldUpdater 深入源码解析
本篇主要对AtomicLong、AtomicLongArray、AtomicLongFieldUpdater进行讲解,本博已经对AtomicInteger、AtomicIntegerArray、AtomicIntegerFieldUpdater源码进行了深入解析。其实这几个类原理都是类似的,不同的是针对的操作数据类型有差异。 演示示例: 可以参考《AtomicBoolean 完全源码解析》、《AtomicInteger 完全源码解析》、《AtomicIntegerArray 深入源码解析》、《A原创 2020-06-18 14:39:50 · 8079 阅读 · 0 评论 -
AtomicIntegerFieldUpdater 深入源码详解
AtomicIntegerFieldUpdater可以在多线程环境下安全的更新对象中的整型成员变量。 演示示例:package com.securitit.serialize.atomics;import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;public class AtomicIntegerFieldUpdaterTester { // 创建AtomicIntegerFieldUpdater实例. public原创 2020-06-16 09:31:48 · 8070 阅读 · 1 评论 -
AtomicIntegerArray 深入源码详解
AtomicIntegerArray用于原子的更新int类型数组的值。也就是以整个数组对象为单位,元素可以原子性的操作。AtomicXXXXX都是以volatile+CAS方式来实现原子操作的,但是AtomicIntegerArray却使用的是final关键字在多线程环境下的语义。 演示示例: 首先我们先演示一下AtomicIntegerArray怎么使用,首先新建一个Thread类,用来模拟多线程环境:package com.securitit.serialize.atomics;imp原创 2020-06-16 09:29:20 · 8522 阅读 · 0 评论 -
AtomicInteger 完全源码解析
AtomicInteger可以用于原子的更新int变量的值,但不可用于替换java.lang.Integer。同时,AtomicInteger集成了Number类型,允许统一访问基于Number类的工具类和程序代码。 AtomicInteger依赖CAS原始实现,在多线程环境下,能保证AtomicInteger所包装的int原子的进行加减操作。 普通int加减: 在无锁环境下,针对int的复合操作是无法保证原子性的。在多线程环境下,非原子性操作是会发生错乱,导致产生非预期的结果。 演示原创 2020-06-14 22:56:03 · 8268 阅读 · 0 评论 -
AtomicBoolean 完全源码解析
AtomicBoolean可以用于原子的更新boolean变量的值,但不可用于替换java.lang.Boolean。 AtomicBoolean依赖CAS原始实现,在多线程高并发环境下,能保证只有一个线程对AtomicBoolean变量的修改有效。 演示示例:package com.securitit.serialize.atomics;import java.util.concurrent.atomic.AtomicBoolean;public class AtomicBoolea原创 2020-06-14 22:53:13 · 8083 阅读 · 0 评论 -
Unsafe 完全解析
Unsafe类内提供了众多直接进行底层操作的方法,包括对象内存操作、非堆内存管理、CAS等,由于这些方法均采用JNI方式实现,Java通过C++等更贴近底层的语言实现,所以在性能上可以取得更好的效果。与此同时,一些操作游离在JVM体系之外,GC等机制无法有效管理Unsafe API产生的影响,因而Unsafe类是不安全的,并不建议使用该类。 Unsafe 实例化 通过查看Unsafe源码,可以看出: Unsafe类本身将构造函数私有化,无法通过正常的方式进行实例化:private Unsa原创 2020-06-14 22:50:36 · 9645 阅读 · 1 评论 -
CAS 完全解析
概念 查看JUC包源码时,会发现JUC包中很多操作都是基于CAS基础实现的,CAS是一种无锁算法,在不阻塞程序的情况下,提供多线程安全可靠的数据操作。 所谓的CAS,即是compareAndSwap,比较并替换。CAS操作中,包括三个操作数:内存值V、旧预期值A和新预期值B。CAS执行过程:当内存置V=旧的预期值A时,将内存值V修改为新预期值B,否则放弃修改,重新执行这一过程。 CAS与JUC 在JUC大量使用了CAS操作,例如AtomicBoolean中的compareAndSet方法原创 2020-06-14 22:46:13 · 8735 阅读 · 0 评论 -
JUC 并发工具集简介
JUC 简介 自Java1.5版本开始,提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中常用的工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架;还提供了设计用于多线程上下文中的 Collection 实现等; UML 结构图 JUC包内容看起来不少,我们通过UML来说明包内类之间的关系。 首先来看一下java.util.concurrent.atomic包,由于Java中数据类型对于复核操作(非原子操作)在多线程原创 2020-06-14 22:43:27 · 8208 阅读 · 0 评论
分享