随笔分类 -  并发包

JUC
摘要:前言 Phaser是从JDK7开始提供的一个可重复使用的同步机制,它在功能上类似于CyclicBarrier和CountDownLatch,但它支持更灵活的使用场景。使用Phaser不仅能够替代CyclicBarrier和CountDownLatch,还能够做到它们做不到的功能。 通过前面的章节我们 阅读全文
posted @ 2021-05-11 17:24 莫待樱开春来踏雪觅芳踪 阅读(588) 评论(1) 推荐(1)
摘要:Striped64原理 通过前面的几章关于原子类的同步数据结构分析,我们知道Java并发包提供的原子类都是采用volatile+CAS机制实现的,这种轻量级的实现方式比传统的synchronize一般来说更加高效,但是在高并发下依然会导致CAS操作的大量竞争失败自旋重试,这时候对性能的影响说不定还不 阅读全文
posted @ 2021-05-11 17:18 莫待樱开春来踏雪觅芳踪 阅读(859) 评论(0) 推荐(3)
摘要:引言 ThreadLocalRandom类是从JDK7开始在并发包下新增的随机数生成器,它解决了Random类在多线程下多个线程竞争内部唯一的原子性种子变量而导致大量线程自旋重试的不足。ThreadLocalRandom为后面要探讨的高并发累加器Striped64及其实现类提供了基础,所以先要理解它 阅读全文
posted @ 2021-05-11 17:14 莫待樱开春来踏雪觅芳踪 阅读(635) 评论(0) 推荐(0)
摘要:引言 在上一文CPU高速缓存行之伪共享中,我们探讨了高速缓存行的伪共享对Java程序带来的问题以及坎坷的解决之路。幸运的是,最终由官方给出了sun.misc.Contended注解结束了这场悲剧。在上文中可以发现,对于Java对象的内存布局还是比较重要的,而且Contended注解不但能够用在类上, 阅读全文
posted @ 2021-05-11 17:10 莫待樱开春来踏雪觅芳踪 阅读(929) 评论(0) 推荐(1)
摘要:什么是伪共享 为了理解“伪共享”,在上一文CPU高速缓存那些事儿中我们主要对CPU高速缓存的原理构造进行大致的了解,其实通过CPU高速缓存的理解以及在文末提到的缓存一致性协议,我们已经能够很容易的理解所谓的“伪共享”的问题。 在这里,我们在来回顾一下CPU高速缓存的知识,在现代计算机中,CPU缓存是 阅读全文
posted @ 2021-05-11 17:07 莫待樱开春来踏雪觅芳踪 阅读(477) 评论(0) 推荐(1)
摘要:引言 前面介绍的原子更新器都只是针对单个对象或者字段元素进行原子更新操作,在序章中提到的第四类复合型的原子更新器可以将一个引用变量与其他变量绑定到一起,实现复合的原子更新操作,这类更新器有两个: AtomicMarkableReference、AtomicStampedReference。 Atom 阅读全文
posted @ 2021-05-11 16:58 莫待樱开春来踏雪觅芳踪 阅读(75) 评论(0) 推荐(0)
摘要:引言 接下来是原子类序章中我们提到的原子更新字段类,它们是AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater。其实就是了原子的更新一个引用类型的整形字段、long型字段、引用类型字段。 Atomic 阅读全文
posted @ 2021-05-11 16:56 莫待樱开春来踏雪觅芳踪 阅读(116) 评论(0) 推荐(0)
摘要:引言 通过原子类序章我们知道Java并发包提供的原子类共分5类,这里开始介绍第二类数组类,其实也就是通过数组下标原子更新基本类型和引用类型的数组中的元素,它们是:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray。由于AtomicLongA 阅读全文
posted @ 2021-05-11 16:52 莫待樱开春来踏雪觅芳踪 阅读(161) 评论(0) 推荐(0)
摘要:引言 通过原子类序章我们知道Java并发包提供的原子类共分5类,这里开始介绍第一类标量类,其实也就是原子更新基本类型和引用类型,它们是:AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference. 它们提供的方法基本相同,其中AtomicBoolea 阅读全文
posted @ 2021-05-11 16:43 莫待樱开春来踏雪觅芳踪 阅读(159) 评论(0) 推荐(0)
摘要:概述 关于Java并发包的原子相关类其实可以在Unsafe后面紧接着进行介绍,因为这些原子类其实只是建立在对Unsafe的调用基础上并没有利用到Java并发包的其他类,出于前面介绍的同步组件在Java并发包的重要性,我才将它们放在了原子类的前面。 Java从JDK 1.5开始提供的java.util 阅读全文
posted @ 2021-05-11 16:38 莫待樱开春来踏雪觅芳踪 阅读(109) 评论(0) 推荐(0)
摘要:引言 在上一章我们了解了ReentrantReadWriteLock读写锁,它实现了多个读操作之间不再被相互等待阻塞,但是读操作和写操作之间,写操作和写操作之间依然还是会被相互阻塞。另外,ReentrantReadWriteLock读写锁有个很致命的缺陷,那就是当读多写少的时候将可能会存在写线程饥饿 阅读全文
posted @ 2021-05-11 16:36 莫待樱开春来踏雪觅芳踪 阅读(174) 评论(0) 推荐(0)
摘要:前言 在前面我们介绍的独占式同步组件ReentrantLock实现了标准的互斥操作,它是和synchronize关键字一样在某一时刻只有一个线程能够获得同步锁,从使用者的角度出发,它还是一种保守锁策略,试想:对共享资源的并发访问中,大部分都是执行读操作,而变更共享资源的写操作却非常少,在这种情况下, 阅读全文
posted @ 2021-05-11 16:31 莫待樱开春来踏雪觅芳踪 阅读(133) 评论(0) 推荐(0)
摘要:引言及简介 前面我们介绍了独占锁ReentrantLock实现的一个同步辅助工具CyclicBarrier, 它能够使一组线程互相等待,今天我们介绍另一种同步辅助器CountDownLatch,它其实可以看着是利用共享锁实现的,只不过它没有使用到类似共享锁Semaphore那么复杂的逻辑,所以它的实 阅读全文
posted @ 2021-05-11 16:27 莫待樱开春来踏雪觅芳踪 阅读(89) 评论(0) 推荐(0)
摘要:前言 前面我们学习了AQS以及基于AQS实现的Du占锁ReentrantLock和基于ReentrantLock实现的同步辅助工具CyclicBarrier,本节我们学习JDK提供的另一个类Semaphore。Semaphore翻译过来就是“信号量”,JDK提供的这个Semaphore被称之为计数信 阅读全文
posted @ 2021-05-11 16:25 莫待樱开春来踏雪觅芳踪 阅读(239) 评论(0) 推荐(0)
摘要:引言及简介 上一章我们介绍了独占式的同步组件ReentrantLock,今天我们先不忙着继续介绍其他Lock接口的实现类同步组件,先来看看JDK基于ReentrantLock同步组件以及Condition条件等待机制实现的一个同步辅助器CyclicBarrier。 CyclicBarrier是一个同 阅读全文
posted @ 2021-05-11 16:22 莫待樱开春来踏雪觅芳踪 阅读(101) 评论(0) 推荐(0)
摘要:前言 ReentrantLock作为Java并发包显示锁的典型实现,又被称作可重入的独占锁,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵 阅读全文
posted @ 2021-05-11 16:19 莫待樱开春来踏雪觅芳踪 阅读(106) 评论(0) 推荐(0)
摘要:引言 终于走到这一步,在JDK5之前,Java都是通过synchronized关键字实现同步锁功能的,通过前面对synchronized关键字的阐述,相信我们已经非常了解了其特性,它是为了保证在多线程并发下对共享资源的访问的线程安全。从JDK5开始,Java提供了另一种加锁的方式即我们在可见性、有序 阅读全文
posted @ 2021-05-11 16:16 莫待樱开春来踏雪觅芳踪 阅读(141) 评论(0) 推荐(0)
摘要:一、引言 在上一章的AQS同步阻塞与唤醒源码分析中,我们知道作为同步组件的基础核心框架AQS(AbstractQueuedSynchronizer), 其内部层次结构分为三部分,第一部分是AbstractQueuedSynchronizer类本身,第二部分是实现同步队列节点的静态内部类Node,第三 阅读全文
posted @ 2021-05-11 16:15 莫待樱开春来踏雪觅芳踪 阅读(381) 评论(0) 推荐(0)
摘要:四、AQS共享获取/释放源码分析 在上文中对Du占方式获取和释放共享资源相关的源码进行了分析,本节接着开始对共享式获取/释放资源的源码进行分析。共享式与Du占式的最主要区别在于同一时刻Du占式只能有一个线程成功获取同步资源,而共享式在同一时刻可以有多个线程成功获取同步资源。例如读操作可以有多个线程同 阅读全文
posted @ 2021-05-11 16:11 莫待樱开春来踏雪觅芳踪 阅读(268) 评论(0) 推荐(0)
摘要:一、引言 AQS,是AbstractQueuedSynchronizer的简称,它是Java5构建锁或者其他同步组件的基础核心框架,是理解整个Java并发包最关键的类,没有之一。同时,AQS解决了实现同步器时的大量细节问题,例如同步状态的基本操作、FIFO同步阻塞队列操作、Condition条件阻塞 阅读全文
posted @ 2021-05-11 16:06 莫待樱开春来踏雪觅芳踪 阅读(300) 评论(0) 推荐(0)