JUC系列
weixin_42073629
这个作者很懒,什么都没留下…
展开
-
Java多线程系列--juc原子类解决CAS的ABA问题
在自旋锁中,中使用了java.util.concurrent.atomic.AtomicStampedReference原子变量指向工作队列的队尾,为何使用AtomicStampedReference原子变量而不是使用AtomicReference是因为这个实现中等待队列的同一个节点具备不同的状态,而同一个节点会多次进出工作队列,这就有可能出现出现ABA问题。熟悉并发编程的同学应该知道CAS操...原创 2020-03-15 02:26:40 · 387 阅读 · 0 评论 -
Java多线程系列--juc原子类
在java.util.concurrent.atomic包里的类,总共有如下12个,根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类。1.基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2.数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;3....原创 2020-03-15 02:17:37 · 172 阅读 · 0 评论 -
Java多线程系列--深入理解AQS(三)
上一篇帖了很多AQS的代码,可以看出AQS的实现思路很简单,就是提供了获取acquire和释放操作release,提供了1. 可中断和不可中断的版本2. 可定时和不可定时的版本3. 独享和共享的版本看过之前实现各种自旋锁系列的同学应该知道,在自旋锁的实现中,获取锁和释放锁操作的逻辑基本如下:自旋锁获取锁操作while 状态不允许获取锁 {自旋}进入锁...原创 2020-03-11 02:03:09 · 128 阅读 · 0 评论 -
Java多线程系列--深入理解AQS(二)
上一篇介绍了AQS的基本设计思路以及两个内部类Node和ConditionObject的实现,这篇说一说AQS的主要方法的实现。AQS和CLHLock的最大区别是,CLHLock是自旋锁,而AQS使用Unsafe的park操作让线程进入等待(阻塞)。线程加入同步队列,和CLHLock一样,从队尾入队列,使用CAS+轮询的方式实现无锁化。入队列后设置节点的prev和next引用,形成双向链表...原创 2020-03-11 01:31:35 · 158 阅读 · 0 评论 -
Java多线程系列--深入理解AQS(一)
AQS是AbstractQueuedSynchronizer的缩写,AQS是Java并包里大部分同步器的基础构件,利用AQS可以很方便的创建锁和同步器。它封装了一个状态,提供了一系列的获取和释放操作,这些获取和释放操作都是基于状态的。它的基本思想是由AQS负责管理同步器类中的状态,其他的同步器比如可重入锁ReentrantLock, 信号量Semaphore基于各自的特点来调用AQS提供了基础能力...原创 2020-03-11 01:21:10 · 134 阅读 · 0 评论 -
Java多线程系列--利用自旋原理来无锁实现“只创建一次”的场景
相信看过之前几篇自旋锁实现的同学对设计一个自旋锁会有一定的感觉,有几个实现的要点很实用:1. 使用AtomicBoolean原子变量的getAndSet(true)方法来实现并发情况下,找到第一个成功执行方法的线程。这个技巧经常使用,在并发编程中经常会遇到这种需求2.经常会使用volatile boolean类型的变量在多个线程之间同步状态,需要注意的是,对volatile变量的修改只具有...原创 2020-03-10 23:41:50 · 425 阅读 · 0 评论 -
Java多线程系列--“JUC自旋锁六”(时限有界锁CompositeLock有tryLock)
Java多线程系列--“JUC自旋锁五”(时限有界锁CompositeLock无tryLock) 给出了限时有界队列锁的lock和unlock实现,这篇给出tryLock的实现tryLock比lock稍微复杂一点,要处理超时的情况。超时有几种情况:1. 第一步在等待队列还没有获得节点的时候超时,直接返回false即可2. 第二步在等待队列已经获得节点但是还没有加入工作队列时超时,把节点...原创 2020-03-10 13:14:11 · 195 阅读 · 0 评论 -
Java多线程系列--“JUC自旋锁五”(时限有界锁CompositeLock无tryLock)
在Java多线程系列--“JUC自旋锁四”(时限无界队列锁TimeoutLock)中实现的限时队列锁是一个基于链表的限时无界队列锁,它的tryLock方法支持限时操作和中断操作,无饥饿,保证了先来先服务的公平性,在多个共享状态上自旋,是低争用的。但是它的一个缺点是牺牲了空间,为了让线程可以多次使用锁,每次Lock的时候都要new QNode,并设置给线程,而不能重复使用原来的节点。这篇说说限时...原创 2020-03-09 01:25:46 · 238 阅读 · 0 评论 -
Java多线程系列--“JUC自旋锁四”(时限无界队列锁TimeoutLock)
本文是时限队列锁的一种实现方式。 java并发包中的Lock定义包含了时限锁的接口:public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long ...原创 2020-03-09 01:05:03 · 278 阅读 · 0 评论 -
Java多线程系列--“JUC自旋锁三”(队列锁基于NUMA系统模式的MCSLock)
在Java多线程系列--“JUC自旋锁二”(队列锁ArrayLock和CLHLock) 这篇中介绍了两种队列锁,一种是有界队列锁,一种是无界队列锁。其中无界队列锁CLHLock采用了链表的方式来组织多线程,使用了两个ThreadLocal做指针指向自身的node和前一个node。它的特点是在前一个node的lock状态自旋,当前一个node的锁释放时,会自动通知下一个线程去获得锁。CLHLoc...原创 2020-03-09 00:44:28 · 158 阅读 · 0 评论 -
Java多线程系列--“JUC自旋锁二”(队列锁ArrayLock和CLHLock)
在Java多线程系列--“JUC自旋锁”(TASLock和TTASLock) 这篇中实现了两种基本的自旋锁:TASLock和TTASLock,它们的问题是会进行频繁的CAS操作,引发大量的缓存一致性流量,导致锁的性能不好。对TTASLock的一种改进是BackoffLock,它会在锁高争用的情况下对线程进行回退,减少竞争,减少缓存一致性流量。但是BackoffLock有三个主要的问题:1....原创 2020-03-09 00:25:40 · 176 阅读 · 0 评论 -
Java多线程系列--“JUC自旋锁一”(TASLock和TTASLock)
在Java多线程--理解缓存一致性协议以及对并发编程的影响 我们了解了处理器缓存一致性协议的原理,并且提到了它对并发编程的影响,“多个线程对同一个变量一直使用CAS操作,那么会有大量修改操作,从而产生大量的缓存一致性流量,因为每一次CAS操作都会发出广播通知其他处理器,从而影响程序的性能。”这一篇我们通过两种实现自旋锁的方式来看一下不同的编程方式带来的程序性能的变化。先理解一下什么是自旋,...原创 2020-03-09 00:10:37 · 153 阅读 · 0 评论 -
Java多线程系列--sun.misc.Unsafe的理解
前言Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka等。使用Unsafe可用来直接访问系统内存资源并进行自主管理,Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。Unsafe可认为是Java中留下的后门,提供...原创 2020-02-25 02:44:33 · 777 阅读 · 0 评论 -
Java多线程系列--“JUC锁”12之 Exchanger交换者的原理和示例
Exchanger简介Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据。常量介绍 private static final int ASHIFT = 7; // 两个有效槽(slot -> Node)之间的字节地址长度(内存地址,以字节为单位),1 << 7至少为缓存行的大小,防止伪共享 private ...原创 2020-02-24 01:09:14 · 267 阅读 · 0 评论 -
Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例
Semaphore简介Semaphore是一个计数信号量,它的本质是一个"共享锁"。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。Semaphore的函数列表// 创建具有给定的许可数和非公平的公平设...原创 2020-01-29 05:08:51 · 152 阅读 · 0 评论 -
Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例
CyclicBarrier简介CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。注意比较CountDownLatch和CyclicBarrier:(01) CountDownLatch的作用是允许1或N个线程等待其他线...原创 2020-01-29 03:49:12 · 108 阅读 · 0 评论 -
Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例
CountDownLatch简介CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch和CyclicBarrier的区别(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。(02) CountDownLatch的...原创 2020-01-29 01:32:48 · 149 阅读 · 0 评论 -
Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock
ReadWriteLock 和 ReentrantReadWriteLock介绍ReadWriteLock,顾名思义,是读写锁。它维护了一对相关的锁 — — “读取锁”和“写入锁”,一个用于读取操作,另一个用于写入操作。“读取锁”用于只读操作,它是“共享锁”,能同时被多个线程获取。“写入锁”用于写入操作,它是“独占锁”,写入锁只能被一个线程锁获取。注意:不能同时存在读取锁和写入锁!Re...原创 2020-01-27 05:21:50 · 149 阅读 · 0 评论 -
Java多线程系列--“JUC锁”07之 LockSupport
LockSupport介绍LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。因为park() 和 unpark()有许可的存在;调用 park() 的...原创 2020-01-27 04:56:16 · 103 阅读 · 0 评论 -
Java多线程系列--“JUC锁”06之 Condition条件
Condition介绍Condition的作用是对锁进行更精确的控制。Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。不同的是,Object中的wait(),notify(),notifyA...原创 2020-01-27 04:49:45 · 123 阅读 · 1 评论 -
Java多线程系列--“JUC锁”05之 非公平锁
获取非公平锁(基于JDK1.7.0_40)非公平锁和公平锁在获取锁的方法上,流程是一样的;它们的区别主要表现在“尝试获取锁的机制不同”。简单点说,“公平锁”在每次尝试获取锁时,都是采用公平策略(根据等待队列依次排序等待);而“非公平锁”在每次尝试获取锁时,都是采用的非公平策略(无视等待队列,直接尝试获取锁,如果锁是空闲的,即可获取状态,则获取锁)。在前面的“Java多线程系列--“JUC锁”...原创 2020-01-27 04:25:00 · 101 阅读 · 0 评论 -
Java多线程系列--“JUC锁”04之 公平锁(二)
释放公平锁(基于JDK1.7.0_40)1. unlock()unlock()在ReentrantLock.java中实现的,源码如下:public void unlock() { sync.release(1);}说明:unlock()是解锁函数,它是通过AQS的release()函数来实现的。在这里,“1”的含义和“获取锁的函数acquire(1)的含义”一样,...原创 2020-01-27 04:16:20 · 116 阅读 · 0 评论 -
Java多线程系列--“JUC锁”03之 公平锁(一)
基本概念本章,我们会讲解“线程获取公平锁”的原理;在讲解之前,需要了解几个基本概念。后面的内容,都是基于这些概念的;这些概念可能比较枯燥,但从这些概念中,能窥见“java锁”的一些架构,这对我们了解锁是有帮助的。1.AQS-- 指AbstractQueuedSynchronizer类。 AQS是java中管理“锁”的抽象类,锁的许多公共方法都是在这个类中实现。AQS是独占锁(例如...原创 2020-01-27 04:10:19 · 202 阅读 · 0 评论 -
ConcurrentHashMap1.7和1.8的不同实现
一、JDK1.7数据结构jdk1.7中采用Segment+HashEntry的方式进行实现,结构如下: ConcurrentHashMap初始化时,计算出Segment数组的大小ssize和每个Segment中HashEntry数组的大小cap,并初始化Segment数组的第一个元素;其中ssize大小为2的幂次方,默认为16,cap大小也是2的幂次方,最小值为2,...原创 2020-01-27 02:28:39 · 179 阅读 · 0 评论 -
Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
ReentrantLock介绍ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有;而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取。ReentrantLock分为“公平锁”和“非公平锁”。它们的区别体现在获取锁的机制上是否公平。“锁”是为了保护竞争资源,防止多个线程同时操作线程...原创 2019-10-18 00:33:56 · 142 阅读 · 0 评论 -
Java多线程系列--“JUC锁”01之 框架
本章,我们介绍锁的架构;后面的章节将会对它们逐个进行分析介绍。目录如下:01.Java多线程系列--“JUC锁”01之 框架02.Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock03.Java多线程系列--“JUC锁”03之 公平锁(一)04.Java多线程系列--“JUC锁”04之 公平锁(二)05.Java多线程系列--“JUC锁”05之 非公...原创 2019-10-17 23:10:09 · 161 阅读 · 0 评论 -
Java多线程系列--“JUC集合”10之 ConcurrentLinkedQueue
ConcurrentLinkedQueue介绍ConcurrentLinkedQueue是线程安全的队列,它适用于“高并发”的场景。它是一个基于链接节点的无界线程安全队列,按照 FIFO(先进先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外)。ConcurrentLinkedQueue原理和数据结构ConcurrentLinkedQueue的数...转载 2019-10-11 02:30:55 · 197 阅读 · 0 评论 -
Java多线程系列--“JUC集合”09之 LinkedBlockingDeque
LinkedBlockingDeque介绍LinkedBlockingDeque是双向链表实现的双向并发阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除);并且,该阻塞队列是支持线程安全。此外,LinkedBlockingDeque还是可选容量的(防止过度膨胀),即可以指定队列的容量。如果不指定,默认容量大小等于Integer.MAX_V...原创 2019-10-11 02:23:49 · 115 阅读 · 0 评论 -
Java多线程系列--“JUC集合”08之 LinkedBlockingQueue
LinkedBlockingQueue介绍LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。此外,LinkedBlockingQueue还是可选容量的(防止过度膨胀),即可以指定...原创 2019-10-11 02:13:35 · 151 阅读 · 0 评论 -
Java多线程系列--“JUC集合”07之 ArrayBlockingQueue
ArrayBlockingQueue介绍ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。线程安全是指,ArrayBlockingQueue内部通过“互斥锁”保护竞争资源,实现了多线程对竞争资源的互斥访问。而有界,则是指ArrayBlockingQueue对应的数组是有界限的。 阻塞队列,是指多线程访问竞争资源时,当竞争资源已被某线程获取时,其它要获取该资源的线程需要...转载 2019-10-11 02:02:59 · 125 阅读 · 0 评论 -
Java多线程系列--“JUC集合”06之 ConcurrentSkipListSet
ConcurrentSkipListSet介绍ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。ConcurrentSkipListSet和TreeSet,它们虽然都是有序的集合。但是,第一,它们的线程安全机制不同,TreeSet是非线程安全的,而ConcurrentSkipListSet是线程安全的。第二,ConcurrentSkipListSet是通过...转载 2019-10-11 01:35:42 · 270 阅读 · 0 评论 -
Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap
ConcurrentSkipListMap介绍ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景。ConcurrentSkipListMap和TreeMap,它们虽然都是有序的哈希表。但是,第一,它们的线程安全机制不同,TreeMap是非线程安全的,而ConcurrentSkipListMap是线程安全的。第二,ConcurrentSkipListMap是...转载 2019-10-11 01:32:36 · 635 阅读 · 0 评论 -
Java多线程系列--“JUC集合”04之 ConcurrentHashMap
ConcurrentHashMap介绍ConcurrentHashMap是线程安全的哈希表。HashMap,Hashtable, ConcurrentHashMap之间的关联如下: HashMap是非线程安全的哈希表,常用于单线程程序中。 Hashtable是线程安全的哈希表,它是通过synchronized来保证线程安全的;即,多线程通过同一个“对象的同步锁”来实现并发控制。H...原创 2019-10-11 01:23:41 · 121 阅读 · 0 评论 -
Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet
概要本章会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解CopyOnWriteArraySet。CopyOnWriteArraySet介绍它是线程安全的无序的集合,可以将它理解成线程安全的HashSet。有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类AbstractSe...原创 2019-10-11 00:47:45 · 104 阅读 · 0 评论 -
Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
概要本章会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解CopyOnWriteArrayList。CopyOnWriteArrayList介绍它相当于线程安全的ArrayList。和ArrayList一样,它是个可变数组;但是和ArrayList不同的时,它具有以下特性:1. 它最适合于具有以下特征的应用程...原创 2019-10-11 00:39:23 · 187 阅读 · 0 评论 -
Java多线程系列--“JUC集合”01之 框架
概要之前,在"Java 集合系列"中,讲解了Java集合包中的各个类。接下来,将展开对JUC包中的集合进行学习。在学习之前,先温习一下"Java集合包"。Java集合包在“Java 集合系列01之 总体框架”中,介绍java集合的架构。主体内容包括Collection集合和Map类;而Collection集合又可以划分为List(队列)和Set(集合)。1. List的实现类主要有...原创 2019-10-10 23:48:31 · 154 阅读 · 0 评论
分享