![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JUC
泠鸳
这个作者很懒,什么都没留下…
展开
-
JUC 线程池 ThreadPoolExecutor原理学习
概述ThreadPoolExecutor,从该类的命名也可以看出,这是一种线程池执行器。当有任务需要执行时,线程池会给该任务分配线程,如果当前没有可用线程,一般会将任务放进一个队列中,当有线程可用时,再从队列中取出任务并执行,如下图:线程池的引入主要为了解决以下问题:方便管理: 由线程池创建、调度、监控和销毁所有线程,能够控制线程数量,避免出现线程泄漏。降低资源消耗:重复利用已经创建的线程执行任务,而不是持续不断地创建和销毁线程,减少了系统因为频繁创建和销毁线程所带来的性能开销。提高响应速度:原创 2020-07-30 18:36:46 · 259 阅读 · 0 评论 -
JUC集合 ConcurrentSkipListMap源码学习
ConcurrentSkipListMap在 ConcurrentSkipListMap 之前,了解跳跃表的概念和基本操作是必要的,如果忽略跳跃表的实际结构直接阅读源码,难度较大。ConcurrentSkipListMap 中有以下两点值得注意的地方:所有全局变量的修改都必须使用 CAS 的方式,这是保证 ConcurrentSkipListMap 属于线程安全集合类的基础。但这是远远不够的,如果其他线程对当前正在进行的操作相关的变量进行了修改,那么之前获取到的值可能不再是现在最新的值了。为了解决原创 2020-07-28 21:34:59 · 270 阅读 · 0 评论 -
JUC集合ConcurrentLinkedQueue 无锁队列 学习
概述ConcurrentLinkedQueue 是非阻塞无界并发队列,主要利用 CAS 实现多线程环境下的并发安全,元素入队出队规则为 FIFO (first-in-first-out 先入先出) 。由于是完全基于无锁算法实现的,所以当出现多个线程同时进行修改队列的操作(比如同时入队),很可能出现CAS修改失败的情况,那么失败的线程会进入下一次自旋,再尝试入队操作,直到成功。所以,在并发量适中的情况下,ConcurrentLinkedQueue一般具有较好的性能。成员变量此类中节点的组织形式为单向链原创 2020-07-26 12:46:02 · 367 阅读 · 0 评论 -
JUC集合 CopyOnWriteArrayList 写时复制数组,源码学习
概述CopyOnWriteArrayList是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的拷贝来实现的。COW模式的体现。成员变量lock :用于修改性操作时需要加的重入锁。array:是底层存放元素的数组,在多线程操作下,其引用经常变化。 /** 保护所有数据更改操作的锁 */ final transient ReentrantLock lock = new ReentrantLock(); /** 数组。原创 2020-07-25 18:35:44 · 213 阅读 · 0 评论 -
JUC集合 ConcurrentHashMap原理,通过源码学习进行深入了解
概述ConcurrentHashMap 是在 HashMap 的基础上进行改进的线程安全 Map 类,在开始 ConcurrentHashMap 前,务必提前了解 HashMap 的原理和基本思想。ConcurrentHashMap 中使用 synchronized 进行锁定,主要用在 put 、remove操作以及扩容操作中,而且每一次锁住的只有当前的桶(数组的单个槽位)。ConcurrentHashMap 和 Hashtable 对象的 key、value 值不可为 null,而 HashMap原创 2020-07-25 12:54:07 · 345 阅读 · 1 评论 -
JUC锁 Locks中的ReentrantReadWriteLock,读写锁原理,通过源码进行学习深入了解
概述ReentrantReadWriteLock 是 ReadWriteLock 接口的具体实现。和 ReentrantLock 一样,它使用 Sync (继承自 AQS 抽象类)作为锁的同步器,支持公平同步器和非公平同步器,分别在 FairSync 和 NonfairSync 中实现。在 AQS 同步器的基础上,此 Lock 实现了两种类型的锁,并把它们作为内部属性。这两种锁分别是读锁(共享锁) ReadLock 和 写锁(独占锁,排他锁)WriteLock。ReentrantReadWriteLo原创 2020-07-22 21:30:24 · 214 阅读 · 0 评论 -
JUC ThreadLocal原理,通过源码进行学习深入了解
概述变量值的共享可以使用public static 变量的形式实现,所有的线程都是用同一个public static变量,那如何实现每一个线程都有自己的变量呢,jdk提供的ThreadLocal就是用于解决这样的问题。ThreadLocal类提供了线程局部 (thread-local) 变量。这些变量与普通变量不同,每个线程都可以通过其 get 或 set方法来访问自己的独立初始化的变量副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,原创 2020-07-21 22:53:41 · 175 阅读 · 0 评论 -
JUC锁 Locks中的ReentrantLock,可重入锁原理,通过源码进行学习深入了解
概述ReentrantLock实现了一个可重入、可中断、可选择公平或非公平竞争的独占模式的锁。该类实现了lock接口,内部使用了一个同步器sync来维护同步状态、阻塞/唤醒线程、管理等待队列等。而这个同步器就是基于AbstractQueuedSynchronizer来实现的。内部类ReentrantLock总共有三个内部类,并且三个内部类是紧密相关的,下面先看三个类的关系。 这三个类中,最底层都是基于AQS实现,其中Sync中将NonfairSync和FairSync两个类都会用到的方法抽取原创 2020-07-20 23:27:56 · 169 阅读 · 0 评论 -
JUC锁 Locks核心类,AQS原理,通过源码进行学习深入了解2
学习本篇,你需要先学习文章JUC锁 Locks核心类,AQS原理,通过源码进行学习深入了解1概述前文介绍了AQS的基本原理,以及不同模式的acquire 如何在阻塞时加入到同步队列,以及维护同步队列的过程。而AQS的独占模式中,还实现了条件等待,即condition,await,signal,signalAll等重要的操作。condition等待队列如下:接下来要分析的就是AQS的内部类ConditionObject,通过源码分析它是如何实现等待和唤醒操作的。ConditionObject内部原创 2020-07-20 16:59:46 · 255 阅读 · 0 评论 -
JUC锁 Locks核心类,AQS原理,通过源码进行学习深入了解1
概述AbstractQueuedSynchronizer抽象类(以下简称AQS)是整个java.util.concurrent包的核心。在JDK1.5时,Doug Lea引入了J.U.C包,该包中的大多数同步器都是基于AQS来构建的。AQS框架提供了一套通用的机制来管理同步状态(synchronization state)、阻塞/唤醒线程、管理等待队列。AQS核心思想AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资原创 2020-07-20 14:53:19 · 239 阅读 · 0 评论