并发
Java并发
住手丶让我来
我是革命一块砖,哪里需要哪里搬!
展开
-
ThreadPoolExecutor源码解析
一、前言 在《阿里巴巴开发手册》中有对针对线程池的使用有着明确的要求,原文如下:【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors 返回的线程池对象的弊端如下: 1)FixedThread...原创 2020-04-15 16:10:33 · 321 阅读 · 0 评论 -
ReentrantLock源码解析
一、简介 使用了AQS的独占获取和释放,用state变量记录某个线程获取独占锁的次数,获取锁时+1,释放锁时-1,在获取时会校验线程是否可以获取锁。ReentrantLock类实现了Lock接口,并提供了与synchronized相同的互斥性和内存可见性,它的底层是通过AQS 来实现多线程同步的。与内置锁相比ReentrantLock不仅提供了更丰富...原创 2020-04-12 16:58:34 · 164 阅读 · 0 评论 -
AQS(AbstractQueuedSynchronizer)源码解析
一、简介 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是用来构建锁或者其他同步 组件(信号量、事件等)的基础框架类。JDK中许多并发工具类的内部实现都依赖于AQS,如ReentrantLock, Semaphore, CountDownLatch等等。学习AQS的使用与源码实现对...原创 2020-04-12 15:13:10 · 381 阅读 · 0 评论 -
DoubleAdder源码解析
一、前言 DoubleAdder是JDK1.8中java.util.concurrent.atomic包中提供了一个新的原子类,和LongAdder差不多,理解了LongAdder也自然懂得了DoubleAdder。可以去看我的另外一篇博客《LonhAdder源码解析》。二、源码解析继承了哪些类 ...原创 2020-04-11 10:52:49 · 458 阅读 · 0 评论 -
LockSupport源码解析
一、前言 LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现。 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞 线程和解除线程阻塞,LockSup...原创 2020-04-11 09:57:16 · 450 阅读 · 0 评论 -
Lock接口注释翻译
一、前言 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。在lock接口出现之前程序是靠synchronized关键字实现锁功能,lock接口提供了与synchronized关键字类似的同步功能,只是在使用的过程中需要显示的获取和释放锁。缺点:缺少隐士获取释放锁的便捷性。优点:拥有锁获取与释放的可操作性...原创 2020-04-10 16:38:09 · 272 阅读 · 0 评论 -
LongAdder源码解析
一、前言 JDK1.8时,java.util.concurrent.atomic包中提供了一个新的原子类:LongAdder。LongAdder在高并发的场景下会比AtomicLong 具有更好的性能,代价是消耗更多的内存空间。二、提出问题1. 为什么要引入LongAdder? 2. LongAdder快在哪里? 3. 如果低并发环境下,Lo...原创 2020-04-10 10:04:32 · 283 阅读 · 0 评论 -
AtomicStampedReference源码解析
一、前言 AtomicInteger、AtomicLong等这类Atomic类都不能避免ABA问题,但项目中经常需要避免这类问题,此时可采用AtomicStampedReference进行辅助开发。AtomicStampedReference内部本身不能避免ABA,但它通过设置版本号,每次设置完成后对版本号进行比对,以此验证更新是否正确,不正确则重试...原创 2020-04-09 10:42:25 · 270 阅读 · 0 评论 -
AtomicReferenceArray源码解析
一、前言 AtomicReferenceArray类是java.util.concurrent.atomic包下的提供了可以原子读取和写入的底层引用数组的操作,并且还包含高级原子操作。 AtomicReferenceArray支持对底层引用数组变量的原子操作。 利用泛型机制可以对多种数据类型进行操作,如Integer等。二、源码解析继承了哪些类...原创 2020-04-09 09:10:13 · 639 阅读 · 0 评论 -
AtomicLongArray源码解析
一、前言 AtomicLongArray和AtomicIntegerArray源码都是差不多的,区别就是数据类型不一样而已,一个是long类型一个是int类型,都是支持对底层数组变量的原子操作。二、源码解析继承了哪些类 由上图可知AtomicLongArray只继承了一个Serializable接...原创 2020-04-08 17:18:43 · 193 阅读 · 0 评论 -
AtomicIntegerArray源码解析
一、前言 AtomicIntegerArray类是java.util.concurrent.atomic包下的提供了可以以原子方式读取和写入的底层int数组的操作,还包含高级原子操作的并发数组类。 AtomicIntegerArray支持对底层int数组变量的原子操作。 它具有获取和设置方法,如在变量上的读取和写入。 也就是说,一个集合与同一变量上的...原创 2020-04-08 16:11:08 · 664 阅读 · 0 评论 -
AtomicReference源码解析
一、前言 AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用。也就是它可以保证你在修改对象引用时的线程安全性。AtomicReference是作用是对”对象”进行原子操作。 提供了一种读和写都是原子性的对象引用变量...原创 2020-04-08 09:47:32 · 352 阅读 · 0 评论 -
AtomicLong源码解析
一、前言 AtomicLong是作用是对长整形进行原子操作,是java.util.concurrent.atomic包下的一个提供原子操作的Long类型数据的类。在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。二、源码...原创 2020-04-08 09:09:36 · 1124 阅读 · 0 评论 -
AtomicBoolean源码解析
一、前言 AtomicBoolean是java.util.concurrent.atomic包下的一个原子并发类,作用是用原子方式更新的 boolean 值。换一句话说,Atomic就是原子性的意思,即能够保证在高并发的情况下只有一个线程能够访问这个属性值(类似我们之前所说的volatile)。二、源码解析继承了哪些类 ...原创 2020-04-07 15:03:30 · 223 阅读 · 0 评论 -
AtomicInteger源码解析
一、前言 AtomicBoolean是java.util.concurrent.atomic包下的一个提供原子操作的Integer的类。在Java语言中,++i和i++、–i和i–操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字,而AtomicInteger则通过一种线程安全的加减操作接口。二、源码解析继承了哪些...原创 2020-04-07 15:32:44 · 217 阅读 · 0 评论 -
高并发编程之AtomicLongArray讲解
一、AtomicLongArray介绍AtomicLongArray的作用则是对"长整形数组"进行原子操作,可以用原子方式更新其元素的 long 数组二、AtomicLongArray几个常用的方法代码实例①、创建给定长度的新 AtomicIntegerArray。package chapter3.atomiclongarray;import java.util.concurrent....原创 2019-02-21 18:41:45 · 1019 阅读 · 0 评论 -
ForkJoin框架之使用RecursiveAction将大任务分解成小任务
一、RecursiveAction介绍通常我们并不直接继承 ForkJoinTask,它包含了太多的抽象方法。针对特定的问题,我们可以选择 ForkJoinTask 的不同子类来完成任务。RecursiveAction 是 ForkJoinTask 的一个子类,它代表了一类最简单的 ForkJoinTask:不需要返回值,当子任务都执行完毕之后,不需要进行中间结果的组合。如果我们从 Recurs...原创 2019-02-24 18:36:17 · 1022 阅读 · 0 评论 -
高并发编程之ScheduledThreadPoolExecutor讲解
一、ScheduledThreadPoolExecutor介绍ScheduledThreadPoolExecutor,它可另行安排在给定的延迟后运行命令,或者定期执行命令。需要多个辅助线程时,或者要求 ThreadPoolExecutor 具有额外的灵活性或功能时,此类要优于Timer。二、ScheduledThreadPoolExecutor相对于Timer的优势ScheduledThre...原创 2019-02-25 23:00:33 · 2277 阅读 · 0 评论 -
高并发编程之AtomicBoolean讲解
一、AtomicBoolean介绍AtomicBoolean是Java.util.concurrent.atomic包下的原子变量,这个包里面提供了一组原子类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线...原创 2019-02-20 19:57:39 · 2663 阅读 · 0 评论 -
高并发编程之AtomicLong讲解
一、AtomicLong介绍AtomicLong是作用是对长整形进行原子操作。在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。二、AtomicLong的几个常用方法①.创建具有初始值 0 的新 AtomicLong。package chapter3.Atom...原创 2019-02-20 20:25:58 · 29256 阅读 · 5 评论 -
高并发编程之AtomicReference讲解
一、AtomicReference介绍①.AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用。也就是它可以保证你在修改对象引用时的线程安全性。②.AtomicReference是作用是对”对象”进行原子操作。 提供了一种读和写都是原子性的对象引用变量。原子意味着多个线程...原创 2019-02-20 21:02:35 · 53537 阅读 · 0 评论 -
高并发编程之AtomicStampedReference讲解
一、AtomicStampedReference介绍①.AtomicStampedReference用来解决AtomicInteger中的“ABA”问题。②.AtomicStampedReference内部不仅维护了对象值,还维护了一个时间戳(我这里把它称为时间戳,实际上它可以使任何一个整数,它使用整数来表示状态值)。当AtomicStampedReference对应的数值被修改时,除了更新数...原创 2019-02-20 22:59:14 · 1075 阅读 · 0 评论 -
高并发编程之ArrayBlockingQueue讲解
一、ArrayBlockingQueue介绍ArrayBlockingQueue:是一个用数组实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序。支持公平锁和非公平锁。【注:每一个线程在获取锁的时候可能都会排队等待,如果在等待时间上,先获取锁的线程的请求一定先被满足,那么这个锁就是公平的。反之,这个锁就是不公平的。公平的获取锁,也就是当前等待时间最长的线程先获取锁】二、Ar...原创 2019-02-26 23:05:36 · 2902 阅读 · 0 评论 -
高并发编程之PriorityBlockingQueue讲解
一、PriorityBlockingQueue介绍①、PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素,是二叉树最小堆的实现,研究过数组方式存放最小堆节点的都知道,直接遍历队列元素是无序的。②、PriorityBlockingQueue可以理解为public操作都加锁的PriorityQueue,通过排他锁保证了操作的线程安全。Priority...原创 2019-02-26 23:49:53 · 2250 阅读 · 0 评论 -
ForkJoin框架之使用RecursiveTask将大任务分解成小任务
一、ForkJoin框架介绍Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。这种开发方法也叫做分治编程,可以极大地利用CPU资源,提高任务执行的效率。Fork/Join框架要完成两件事情:①、任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子...原创 2019-02-24 14:51:13 · 1625 阅读 · 1 评论 -
高并发编程之Condition工具类讲解
一、Condition介绍Condition将Object监视器方法(wait、notify和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用。其中Lock与synchronized区别:①、Lock替代了synchronized方法的使用及作用,②、Condition替代了Object监视器方法的使用及作用。③、Condition的await方法...原创 2019-02-24 10:24:19 · 332 阅读 · 0 评论 -
高并发编程之CopyOnWriteArraySet讲解
一、CopyOnWriteArraySet介绍它是线程安全的无序的集合,可以将它理解成线程安全的HashSet,有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类都继承于共同的父类;但是,HashSet是通过“散列表(HashMap)”实现的,而CopyOnWriteArraySet则是通过“动态数组(CopyOnWriteArrayList)”实现的,并不...原创 2019-02-28 11:24:38 · 11886 阅读 · 0 评论 -
高并发编程之生产者—消费者设计模式
一、生产者—消费者模式介绍生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。二、为什么要使用生产者和消费者模...原创 2019-02-16 22:49:05 · 6797 阅读 · 0 评论 -
高并发编程之Thread-Per-Message设计模式
一、Thread-Per-Message设计模式介绍Thread-Per-Message模式是说为每个请求都分配一个线程,由这个线程来执行处理,使得消息能够并发(但是注意:线程的创建是有限的,可以使用线程池来处理,超过数量则加入等待队列),这里包含两个角色,请求的提交线程和请求的执行线程。二、场景模拟就好比电话接线员一样,每一个电话投诉或业务处理,都会有对应的人员来处理,若打不进,则等待三...原创 2019-02-16 21:42:16 · 212 阅读 · 0 评论 -
高并发编程之CountDown设计模式(CountDownLatch讲解)
一、CountDownLatch介绍CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任...原创 2019-02-16 21:13:39 · 1315 阅读 · 1 评论 -
高并发编程之CountDownLatch工具类讲解
一、CountDownLatch介绍CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任...原创 2019-02-22 09:00:10 · 215 阅读 · 0 评论 -
高并发编程之AtomicReferenceArray讲解
一、AtomicReferenceArray介绍AtomicReferenceArray类提供了可以原子读取和写入的底层引用数组的操作,并且还包含高级原子操作。 AtomicReferenceArray支持对底层引用数组变量的原子操作。 它具有获取和设置方法,如在变量上的读取和写入。 也就是说,一个集合与同一变量上的任何后续获取相关联。二、AtomicReferenceArray几个常用的方法...原创 2019-02-21 22:32:19 · 7277 阅读 · 1 评论 -
高并发编程之AtomicIntegerArray讲解
一、AtomicIntegerArray介绍AtomicIntegerArray可以用原子方式更新其元素的 int 数组,是对Integer数组支持的原子性操作二、AtomicIntegerArray的几个常用的方法代码实例①、创建给定长度的新 AtomicIntegerArray。package chapter3.atomicintegerarray;import java.util...原创 2019-02-21 18:21:17 · 3459 阅读 · 1 评论 -
高并发编程之上下文设计模式(使用ThreadLocal实现)
一、上下文设计模式简介上下文就是贯穿整个系统或者阶段生命周期的对象,其中存贮了一些系统的全局变量信息。在很多时候,单个线程的执行任务步骤非常多的时候,后面的某一步骤需要前面的输出值(责任链模式中特别多),那么需要将参数从头传递到尾,这样会特别的麻烦,并且在参数过多的情况下更加不合适,那么这个时候就需要一个上下文作为上下文进行绑定线程传递了的.java为我们提供了一个很好的容器,就是ThreadL...原创 2019-02-15 23:13:27 · 3014 阅读 · 0 评论 -
高并发编程之保护性暂挂模式
一、简介Guarded Suspension Design Pattern(保持性暂挂模式)意为保护暂停,其核心思想是仅当服务进程准备好时,才提供服务。当线程在访问某个对象时,发现条件不满足,就暂时挂起等待条件满足时再次访问。二、Guarded Suspension Design Pattern 模式的结构Guarded Suspension模式的主要成员有:Request、RequestQ...原创 2019-02-15 18:02:23 · 729 阅读 · 0 评论 -
高并发编程之不可变对象设计模式
一、Immutable介绍不可变对象永远不会发生改变,其字段的值只在构造函数运行时设置一次,其后就不会再改变。例如JDK中常见的两种基本数据类型String和Integer,它们都是不可变对象。二、Immutable的设计原则(需要满足的条件)①.确保类不会被覆写,即该类不会被继承,实现这一点要加上修饰符final;或者使用静态工厂创建方法,确保构造函数私有的。②.所有的字段必须是私有的,...原创 2019-02-15 08:37:59 · 224 阅读 · 0 评论 -
高并发编程之读写锁分离设计模式
一、简介1.读写锁:在同一时刻允许多个读线程访问,但是当写线程访问,所有的写线程和读线程均被阻塞。读写锁维护了一个读锁加一个写锁,通过读写锁分离的模式来保证线程安全,性能高于一般的排他锁。2.读写锁分离设计模式有两种名称:①.ReadWritLock Design Pattern②Reader-Writer Design Pattern3.Reader-Writeer Design Pa...原创 2019-02-15 00:33:47 · 317 阅读 · 0 评论 -
Executors框架创建线程池
一、线程池的简介线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。二、图解线程池的流程三、线程池的六个基本要素(1).任务队列:用来存放多余的任务,例如有10个任务交给线程池处理,但是线程池一次性只能有6个线程处理任务,那多出来的4个任务就放在任务队列中。...原创 2019-02-11 17:41:03 · 300 阅读 · 1 评论 -
高并发编程之CyclicBarrier工具类讲解
一、CyclicBarrier介绍1、CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点。与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyclic)的屏障(Barrier)。2、栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭...原创 2019-02-22 16:17:12 · 155 阅读 · 0 评论 -
高并发编程之ReentrantReadWriteLock工具类讲解
一、ReentrantReadWriteLock介绍①、ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓...原创 2019-02-23 22:20:43 · 264 阅读 · 0 评论