随笔分类 -  JUC

摘要:一、锁的种类 在JUC中,大量使用到了锁,而Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录: 二、悲观锁与乐观锁 对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程 阅读全文
posted @ 2022-06-08 23:09 夏尔_717 阅读(49) 评论(0) 推荐(0) 编辑
摘要:一、简介 LinkedBlockingQueue是java并发包下一个以单链表实现的阻塞队列,它是线程安全的,至于它是不是有界的,请看下面的分析。 二、源码分析 2.1 属性 // 容量 private final int capacity; // 元素数量 private final Atomic 阅读全文
posted @ 2022-06-03 23:24 夏尔_717 阅读(40) 评论(0) 推荐(0) 编辑
摘要:一、简介 SynchronousQueue是java并发包下无缓冲阻塞队列,它用来在两个线程之间移交元素,但是它有个很大的问题,你知道是什么吗?请看下面的分析。 二、源码分析 2.1 属性 // CPU的数量 static final int NCPUS = Runtime.getRuntime() 阅读全文
posted @ 2022-06-03 23:24 夏尔_717 阅读(70) 评论(0) 推荐(0) 编辑
摘要:一、简介 由于LinkedBlockingDeque作为双端队列的实现,采用了单锁的保守策略使其不利于多线程并发情况下的使用,故ConcurrentLinkedDeque应运而生。 它是一种基于链表的无界的同时支持FIFO、LIFO的非阻塞并发双端队列,当许多线程共享对公共集合的访问时,Concur 阅读全文
posted @ 2022-05-19 19:10 夏尔_717 阅读(64) 评论(0) 推荐(0) 编辑
摘要:一、简介 ConcurrentSkipListSet底层是通过ConcurrentNavigableMap来实现的,它是一个有序的线程安全的集合。 二、源码分析 它的源码比较简单,跟通过Map实现的Set基本是一致,只是多了一些取最近的元素的方法。 // 实现了NavigableSet接口,并没有所 阅读全文
posted @ 2022-05-17 14:29 夏尔_717 阅读(73) 评论(0) 推荐(0) 编辑
摘要:一、简介 ArrayBlockingQueue是java并发包下一个以数组实现的阻塞队列,它是线程安全的,至于是否需要扩容,请看下面的分析。 二、源码分析 2.1 属性 // 使用数组存储元素 final Object[] items; // 取元素的指针 int takeIndex; // 放元素 阅读全文
posted @ 2022-05-14 12:43 夏尔_717 阅读(45) 评论(0) 推荐(0) 编辑
摘要:一、简介 CopyOnWriteArraySet底层是使用CopyOnWriteArrayList存储元素的,所以它并不是使用Map来存储元素的。 但是,CopyOnWriteArrayList底层其实是一个数组,它是允许元素重复的,那么用它来实现CopyOnWriteArraySet怎么保证元素不 阅读全文
posted @ 2022-05-13 22:21 夏尔_717 阅读(147) 评论(0) 推荐(0) 编辑
摘要:一、简介 ConcurrentLinkedQueue只实现了Queue接口,并没有实现BlockingQueue接口,所以它不是阻塞队列,也不能用于线程池中,但是它是线程安全的,可用于多线程环境中。 那么,它的线程安全又是如何实现的呢?让我们一起来瞧一瞧。 二、源码分析 2.1 属性 // 链表头节 阅读全文
posted @ 2022-05-13 22:16 夏尔_717 阅读(69) 评论(0) 推荐(0) 编辑
摘要:一、简介 CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不阻塞读操作,实现读写分离。 写入时复制(CopyOnWrite)思想 写入时复制(CopyOnW 阅读全文
posted @ 2022-05-11 16:21 夏尔_717 阅读(31) 评论(0) 推荐(0) 编辑
摘要:一、简介 LinkedTransferQueue是LinkedBlockingQueue、SynchronousQueue(公平模式)、ConcurrentLinkedQueue三者的集合体,它综合了这三者的方法,并且提供了更加高效的实现方式。 二、继承体系 LinkedTransferQueue实 阅读全文
posted @ 2022-05-11 13:42 夏尔_717 阅读(220) 评论(0) 推荐(1) 编辑
摘要:一、简介 PriorityBlockingQueue是java并发包下的优先级阻塞队列,它是线程安全的,如果让你来实现你会怎么实现它呢? 还记得我们前面介绍过的PriorityQueue吗?点击链接直达Java集合之PriorityQueue源码分析 二、源码分析 2.1 属性 // 默认容量为11 阅读全文
posted @ 2022-05-11 13:41 夏尔_717 阅读(48) 评论(0) 推荐(0) 编辑
摘要:一、简介 LinkedBlockingDeque来自于JDK1.5的JUC包,是一个支持并发操作的有界阻塞队列,底层数据结构是一个双链表,可以看作LinkedList的并发版本! LinkedBlockingDeque实现了BlockingDeque接口,而BlockingDeque继承了Block 阅读全文
posted @ 2022-05-08 18:56 夏尔_717 阅读(132) 评论(0) 推荐(0) 编辑
摘要:一、概述 Java集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection接口又有3种子类型,List、Set和Queue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList、LinkedList 阅读全文
posted @ 2022-05-08 18:53 夏尔_717 阅读(122) 评论(0) 推荐(0) 编辑
摘要:# 一、简介 `DelayQueue`是`java`并发包下的延时阻塞队列,常用于实现定时任务。 # 二、案例 ```java public class DelayQueueTest { public static void main(String[] args) { DelayQueue queu 阅读全文
posted @ 2022-05-08 18:46 夏尔_717 阅读(50) 评论(0) 推荐(0) 编辑
摘要:一、简介 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。 LockSupport中的park()和unpark(thread)的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark(thread)不会遇到“Thread.suspend和Thread.resume所可能 阅读全文
posted @ 2022-05-08 18:39 夏尔_717 阅读(181) 评论(0) 推荐(0) 编辑
摘要:一、简介 读写锁是一种特殊的锁,它把对共享资源的访问分为读访问和写访问,多个线程可以同时对共享资源进行读访问,但是同一时间只能有一个线程对共享资源进行写访问,使用读写锁可以极大地提高并发量。 二、特性 读写锁具有以下特性: | 是否互斥 | 读 | 写 | | | | | | 读 | 否 | 是 | 阅读全文
posted @ 2022-05-08 18:38 夏尔_717 阅读(55) 评论(0) 推荐(0) 编辑
摘要:一、简介 StampedLock是java8中新增的类,它是一个更加高效的读写锁的实现,而且它不是基于AQS来实现的,它的内部自成一派逻辑。 StampedLock具有三种模式:写模式、读模式、乐观读模式。 ReentrantReadWriteLock中的读和写都是一种悲观锁的体现,StampedL 阅读全文
posted @ 2022-05-08 18:38 夏尔_717 阅读(240) 评论(0) 推荐(0) 编辑
摘要:一、概述 在学习ConcurrentSkipListMap之前,我们需要来了解一种随机化的数据结构:跳跃表(skip list)。 ConcurrentSkipListMap是一个基于skip list实现的线程安全的有序存储的Map,默认情况下根据key的自然顺序进行排序,或者根据在Map进行创建 阅读全文
posted @ 2022-04-25 17:50 夏尔_717 阅读(113) 评论(0) 推荐(0) 编辑
摘要:一、简介 Future实际采用FutureTask实现,该对象相当于是消费者和生产者的桥梁,消费者通过FutureTask存储任务的处理结果,更新任务的状态:未开始、正在处理、已完成等。而生产者拿到的FutureTask被转型为Future接口,可以阻塞式获取任务的处理结果,非阻塞式获取任务处理状态 阅读全文
posted @ 2022-04-25 16:35 夏尔_717 阅读(613) 评论(0) 推荐(0) 编辑
摘要:一、概述 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 二、使用案例 可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发地读取 阅读全文
posted @ 2022-04-25 16:32 夏尔_717 阅读(70) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示