随笔分类 - JUC
摘要:一、前言 ThreadPoolExecutor是ExecutorService的最重要的实现类,ThreadPoolExecutor不直接实现ExecutorService接口,它直接继承于AbstractExecutorService抽象类,AbstractExecutorService对Exec
阅读全文
摘要:一、概述 我们在并发编程中,目前大部分做法都是将任务添加到线程池中,并拿到Future对象,将其添加到集合中,等所有任务都添加到线程池后,在通过遍历Future集合,调用future.get()来获取每个任务的结果,这样可以使得先添加到线程池的任务先等待其完成,但是并不能保证第一个添加到线程池的任务
阅读全文
摘要:一、概述 以前线程Thread既表示执行的任务,又表示执行的机制。在JDK1.5中,java并发框架提供了一种“执行服务”的相关API,它将"任务的执行"和"任务的提交“相分离,”执行服务“封装了任务执行的细节,对于任务提交者来说,它可进一步聚焦于任务本身,如任务提交、获取任务执行后的结果、取消任务
阅读全文
摘要:一、概述 CompletableFuture现有功能可以满足我们诉求。但当我们引入一些现实常见情况时,一些潜在的不足便暴露出来了。 Java9对CompletableFuture类进行了一些更改。这些更改是作为JEP 266的一部分引入的,CompletableFuture正式提供了orTimeou
阅读全文
摘要:一、概述 CompletionStage是Java8新增得一个接口,用于异步执行中的阶段处理,其大量用在Lambda表达式计算过程中,目前只有CompletableFuture一个实现类。 CompletionStage定义了一组接口用于在一个阶段执行结束之后,要么继续执行下一个阶段,要么对结果进行
阅读全文
摘要:一、JVM层 在java.util.concurrent包下面的很多类为了追求性能都采用了sun.misc.Unsafe类中的CAS操作,从而避免使用synchronized等加锁方式带来性能上的不足。 在sun.misc.Unsafe中CAS方法如下: /** * CAS * @param o 包
阅读全文
摘要:一、概述 在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以来,多线程都存在2个问题: 线程之间内存共享,需要通过加锁进行控制,但是加锁会导致性能下降,同时复杂的加锁机制也会增加编程编码
阅读全文
摘要:一、概述 条件锁就是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。 比如,在阻塞队列中,当队列中没有元素的时候是无法弹出一个元素的,这时候就需要阻塞在条件notEmpty上,等待其它线程往里面放入一个元素后,唤醒这个条件notEmpty,当前线程才
阅读全文
摘要:一、JVM层 Unsafe.park和Unsafe.unpark是sun.misc.Unsafe类的native方法, public native void unpark(Object var1); public native void park(boolean var1, long var2);
阅读全文
摘要:一、概述 ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁
阅读全文
摘要:一、概述 CompletableFuture是对Future的一种强有力的扩展,Future只能通过轮询isDone()方法或者调用get()阻塞等待获取一个异步任务的结果,才能继续执行下一步,当我们执行的异步任务很多,而且相互之前还要依赖结果的时候,可能会创建很多这样的Future,并通过get或
阅读全文
摘要:一、类结构及其成员变量 1.1 类结构和注释 类结构代码如下: public class ForkJoinWorkerThread extends Thread { } ForkJoinWorkerThread继承了Thread类,ForkJoinWorkerThread是由ForkJoinPool
阅读全文
摘要:一、类结构及其成员变量 1.1 类结构和注释 类前面的注释部分如下: ForkJoinTask是在ForkJoinPool中运行task的基础抽象类,ForkJoinTask是类似于线程的实体,其权重比普通线程要轻得多。大量的task或者task的子类可能由ForkJoinPool中实际的线程来托管
阅读全文
摘要:一、类结构及其成员变量 1.1 类结构和注释 WorkQueue是ForkJoinPool的核心内部类,是一个Contented修饰的静态内部类。 /** * Queues supporting work-stealing as well as external task * submission.
阅读全文
摘要:一、总体介绍 在java中运行ForkJoinPool,经过对源码的分析,实际上,需要4个类来配合运行。这四个类分别是: ForkJoinPool:这是线程池的核心类,也是提供方法供我们使用的入口类。基本上forkJoin的核心操作及线程池的管理方法都由这个类提供。 ForkJoinPool.Wor
阅读全文
摘要:一、简介 ForkJoinPool是自Java7开始,提供的一个用于并行执行的任务框架。广泛用在java8的parallelStream和CompletableFuture中。其主旨是将大任务分成若干小任务,之后再并行对这些小任务进行计算,最终汇总这些任务的结果,得到最终的结果。这个描述实际上比较接
阅读全文
摘要:一、简介 AtomicIntegerArray可以用原子方式操作其元素的int数组,是对Integer数组支持的原子性操作。原子数组类与对应的普通原子类相比,只是多了通过索引找到内存中元素地址的操作而已。 注意:原子数组并不是说可以让线程以原子方式一次性地操作数组中所有元素的数组,而是指对于数组中的
阅读全文
摘要:一、简介 AtomicStampedReference可以给引用加上版本号,追踪引用的整个变化过程,如:A -> B -> C -> D - > A,通过AtomicStampedReference可以知道引用变量中途被更改了3次。但是有时候不需要关心引用变量更改了几次,只是单纯的关心是否更改过,所
阅读全文
摘要:一、简介 AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用。也就是说它可以保证你在修改对象引用时的线程安全性。 AtomicReference是作用是对"对象"进行原子操作
阅读全文
摘要:一、简介 AtomicStampedReference是java并发包下提供的一个原子类,它能解决其它原子类无法解决的ABA问题。 二、ABA 2.1 ABA问题 ABA问题发生在多线程环境中,当某线程连续读取同一块内存地址两次,两次得到的值一样,它简单地认为“此内存地址的值并没有被修改过”,然而,
阅读全文

浙公网安备 33010602011771号