
并发编程
文章平均质量分 92
霁云HYY
博客中的很多内容都是取自公众号《儒猿技术窝》中的专栏,进行了一定的修改和总结,感兴趣的同学可以自行查找更加具体的专栏参考和学习
展开
-
DelayQueue源码简析
DelayQueue延迟队列,意思是加入队列的元素可以设置一个延迟时间,当延迟时间到了才可以从队列中出队这个元素,先写一个demo来看看要如何使用DelayQueuepublic class DelayQueueTest { static class MyDelayed implements Delayed { private final long delayTime ; //延迟时间 private final long expire; //到期时间原创 2020-07-05 09:24:53 · 247 阅读 · 0 评论 -
PriorityBlockingQueue源码简析
PriorityBlockingQueue优先队列原创 2020-06-28 15:27:08 · 351 阅读 · 0 评论 -
LinkedBlockingQueue源码简析
上一篇博文画图解析了一下ConcurrentLinkedQueue,这个Queue其实是一个无界队列,按道理可以挂无数个节点在链表中。今天要讲的LinkedBlockingQueue则是一个有界队列,通过他的构造函数来看一下// 无参的构造函数,默认的队列容量是Integer.MAX_VALUE,基本可以认为是一个无界队列了public LinkedBlockingQueue() { this(Integer.MAX_VALUE);}// 最常用的构造函数,传入capacity作为队列的容量原创 2020-06-21 09:31:16 · 190 阅读 · 0 评论 -
ConcurrentLinkedQueue的出入队源码简析
ConcurrentLinkedQueue其实就是一个并发安全的Queue,底层的数据结构使用的是链表,因为使用的是链表,所以源码中会有大量的指针操作,这篇博文就以画图的方式来解析源码首先写一个小demo,然后按照这个demo的逻辑来一步步还原源码的实现流程...原创 2020-06-10 16:58:23 · 266 阅读 · 0 评论 -
CopyOnWriteArrayList源码简析
CopyOnWriteArrayList,是在concurrent包下的一个类,说明这是一个并发安全的类,从命名来看,这是一个线程安全的ArrayList,CopyOnWrite则是实现他并发安全的机制,即写时复制CopyOnWriteArrayList类的用法和ArrayList基本是一样的,所以就不写demo了,这里直接来看一下add方法的源码吧public boolean add(E e...原创 2020-06-04 15:16:36 · 242 阅读 · 0 评论 -
ConcurrentHashMap分段加锁机制简析
ConcurrentHashMap是线程安全的HashMap,我就不多废话了,实现的思想是使用的分段加锁,使用分段加锁的作用当然就是可以有效提升并发量,可以对比一下所有操作都加锁的HashTable,就能明白分段加锁的好处了既然说是分段加锁,那么我们可以猜想一下是根据什么依据来进行分段的呢?我们都知道HashMap的底层是一个数组,当里面的键值对出现了hash冲突的话,就会挂载成为一个链表,链表的阈值达到了8之后就会转化为红黑树,既然底层的数据结构是数组的话,那么是否可以对数组来进行加锁呢?我们拿Con原创 2020-05-30 18:55:54 · 5987 阅读 · 1 评论 -
Semaphore源码简析
之间已经讲过了CountdownLatch和CyclicBarrier,现在来讲讲Semaphore,Semaphore信号量的作用是原创 2020-05-22 20:20:16 · 278 阅读 · 0 评论 -
CyclicBarrier源码简析
之前一篇文章讲了一下CountdownLatch,接下来就来讲讲CyclicBarrier,两者有一些相似的地方,也有一些不同,先通过一段demo来了解一下CyclicBarrier的使用public class CyclicBarrierTest { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() {原创 2020-05-18 10:29:59 · 201 阅读 · 0 评论 -
CountDownLatch源码简析
CountDownLatch把这个单词拆分成两部分,CountDown是倒计时的意思,Latch的意思是门闩,也就是锁的意思,所以CountDownLatch其实是一个倒计时锁,当倒计时不为0的时候,就会被锁阻塞,当倒计时为0时,锁会被释放,继续执行逻辑先来一段demo代码public class CountdownTest { public static void main(Stri...原创 2020-05-12 20:18:45 · 258 阅读 · 0 评论 -
Java的volatile关键字
volatile是Java虚拟机提供的最轻量级的同步机制,当一个变量使用volatile关键字修饰之后,它就会具备两种特性:可见性使用volatile修饰之后的变量,当一个线程修改了这个变量的值,新值对于其他线程来说也是立即可见的。一个很典型的应用场景就像下面的代码 volatile boolean shutdownRequested; public void shutdown()...原创 2020-01-07 20:49:43 · 200 阅读 · 0 评论 -
ThreadLocal源码简析
并发问题最本质的原因其实就是多个线程共享了一个变量,你也要用,我也要用,难免会起冲突那么很简单的,如果每个人都有一个自己的变量副本,大家各用个的,那不就相安无事了,ThreadLocal就是起的这么一个作用当一个变量使用了ThreadLocal修饰,那么每个线程都会有一个这个变量副本,操作的也都是这个变量副本,自然不会产生并发安全问题使用ThreadLocal,其实就是用的他的set和get...原创 2020-05-06 21:09:42 · 218 阅读 · 0 评论 -
Condition源码简析
即使你不了解并发编程,你也肯定听过wait和notify,如果你非要说没听过,那么就…那么就…wait和notify是配合synchronized关键字使用的,如果我们想使用ReentrantLock,那么如何来实现等待和唤醒的功能呢?答案就是使用Condition,先来一段小demo吧public class Demo { static ReentrantLock lock = n...原创 2020-04-29 19:36:10 · 298 阅读 · 0 评论 -
ReentrantReadWriteLock源码简析
在讲ReentrantReadWriteLock读写锁之前,一个没法绕过的东西就是AQS(AbstractQueuedSynchronizer)抽象队列同步器,并发包下的很多组件都是基于AQS来实现的。没有AQS这个地基,就没有ReentrantLock和ReentrantReadWriteLock等这些上层建筑AQS中有三个重要的组成部分,分别是state、exclusiveOwnerThre...原创 2020-04-26 15:45:24 · 234 阅读 · 0 评论 -
Atomic原子类中的CAS语义存在的三个问题
Atomic原子类,可能你没有用过,但你肯定知道,在多线程环境下i++这种的操作是无法保证结果的正确性的,如果使用Atomic原子类来递增的话,则不会有问题Atomic原子类底层使用的就是CAS(compare and swap),这是一种无锁化的机制,比起synchronized关键字的加锁,CAS的效率要高上不少简单来说,CAS其实就先将要修改的变量原值读出来,然后修改,最后再比较一下当前...原创 2020-04-16 17:19:40 · 616 阅读 · 0 评论 -
线程安全的原子性、可见性与有序性
原子性:一个或多个操作在CPU执行过程中不被中断的特性称之为原子性。线程中执行的操作要么全部执行,要么全部不执行。Java内存模型中的read、load、assign、use、store和write都可以保证原子性的操作,一般基本数据类型访问读写都是原子性的(long和double例外,但是基本也不会发生)如果应用场景需要一个更大范围的原子性保证,我们可以直接使用synchronized关键...原创 2020-01-12 14:08:02 · 337 阅读 · 0 评论 -
Synchronized在JDK1.6后的优化
Synchronized在JDK1.6后的优化,主要包括了自适应自旋锁、锁消除、锁粗化、轻量级锁和偏向锁锁主要存在四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,在竞争激烈的状态下锁会从左至右依次升级,一般的说法是锁只能升级而不能降级,但是在http://openjdk.java.net/jeps/8183909上有一段原文:In its current implementatio...原创 2019-11-19 21:23:20 · 861 阅读 · 0 评论