juc
文章平均质量分 66
JAVA探索
对知识的贪婪是我前进的动力
展开
-
详解ThreadLocal
ThreadLocal 线程本地变量ThreadLocal被定义在jdk的<java.lang>包下面,他的作用在于辅助开发者操作线程本地变量,让我们可以在繁琐复杂的方法调用链中灵活的获取线程本地变量,而不用通过鸡肋的引用传递来获取N层调用次数之前的栈内变量。那为什么说他是辅助呢?因为真正的线程本地变量是通过ThreadLocalMap来储存的,而ThreadLocal封装了从当前线程中获取ThreadLocalMap的方法,我们可以通过get()、set(T)方法方便的对当前线程的栈内变量进原创 2021-08-03 12:25:10 · 402 阅读 · 1 评论 -
java.util.concurrent学习(五-3) SortedExecutorCompletionService扩展
在java.util.concurrent学习(五-2) ExecutorCompletionService扩展有序的SortedExecutorCompletionService中对ExecutorCompletionService进行扩展后,有一些不足,这里进行优化。不足点构造函数中BlockingQueue completionQueue并未得到实际的使用,在这个版本中会将其删除获取结果的方法需要制定单线程获取超时时间,这个参数有可能会被认为是获取所有结果的总超时时间,在这个版本中将这两个参数原创 2021-07-02 18:07:22 · 170 阅读 · 0 评论 -
java.util.concurrent学习(五-2) ExecutorCompletionService扩展有序的SortedExecutorCompletionService
在ExecutorCompletionService学习中我们知道,ExecutorCompletionService通过装饰器模式提供了获取已完成的线程结果功能,这大大提高了我们的线程池结果聚合效率。但是这种方式有一种弊端,当我们将已经排好序的结果进行异步提交的时候,获取到的结果是无序的,我们只有通过重新排序或者与之前的排序结果进行对比才能重新得到我们想要的结果,这在开发中无疑提高了代码复杂度,同时也会造成不必要的bug和代码重复。那么我们想一下,能不能有一种方式帮助我们同时使用ExecutorCompl原创 2021-06-15 18:12:05 · 298 阅读 · 0 评论 -
java.util.concurrent学习(五-1) CompletionService,ExecutorCompletionService 原理认识
ExecutorCompletionService的设计目的在于提供一个可获取线程池执行结果的功能,这个类采用了装饰器模式,需要用户提供一个自定义的线程池,在ExecutorCompletionService内部持有该线程池进行线程执行,在原有的线程池功能基础上装饰额外的功能。下面是ExecutorCompletionService的原理图。1 在使用ExecutorCompletionService时需要提供一个自定义的线程池Executor,构造ExecutorCompletionServi原创 2021-06-04 16:10:25 · 286 阅读 · 2 评论 -
java.util.concurrent学习(十) ReadWriteLock,ReentrantReadWriteLock
Lock框架ReadWriteLockReadWriteLock是读写锁的顶端接口,定义了获取读锁和写锁的方法。ReentrantReadWriteLock锁的实现基础SyncReentrantReadWriteLock是ReadWriteLock的默认实现类,其内部定义了一个类似于ReentrantLock中的Sync的抽象类,不同的是,ReentrantReadWrite...原创 2019-06-15 23:58:40 · 213 阅读 · 0 评论 -
java.util.concurrent学习(九) Lock,ReentrantLock
Lock框架LockLock是java.util.concurrent.locks包提供的一个锁操作接口,相比于synchronized只能定义实例域和Class域的代码块,该接口提供了更灵活的方法,在代码层面提供了锁的机制,笔者将会在另一篇文章说明sychronized和Lock的区别。我们来看看都定义了什么接口,下面提到的获取到锁的对象就是一个Lock实例,用同一个lock实例...原创 2019-06-08 20:58:44 · 221 阅读 · 0 评论 -
java.util.concurrent学习(八) AbstractQueuedSynchronizer 内部类Node ,ConditionObject
NodeNode是一个节点类,是AbstractQueuedSynchronizer实现队列的基础单位,内部定义了volatile Node prev、volatile Node next分别指向前一个节点和后一个节点,这样便实现了双向链表或者叫双向队列,而每一个节点都有一个状态属性waitStatus,状态包括了0、CANSELLED、SIGNAL、CONDITION、PROPAGATE五...原创 2019-06-08 17:27:25 · 443 阅读 · 0 评论 -
java.util.concurrent学习(七) ThreadPoolExecutor
ThreadPoolExecutor继承了AbstractExecutorService,是线程池工厂Executors创建线程池的主要实现方式。通过线程池工厂可以快速创建线程池,然而这种方式也有一定的弊端。例如:Executors.newFixedThreadPool(int nThreads)创建的线程池核心线程数固定,不能灵活地扩展最大线程数;newCachedThreadPool方式将最大...原创 2019-07-07 22:37:16 · 340 阅读 · 0 评论 -
java.util.concurrent学习(六) AbstractExecutorService
AbstractExecutorService是ExecutorService的默认实现类,通过新建FutureTask来实现。AbstractExecutorService提供了两个由protected修饰的方法来新建任务,这两个方法分别是: protected <T> RunnableFuture<T> newTaskFor(Runnable runnable,...原创 2019-06-02 15:59:11 · 337 阅读 · 0 评论 -
java.util.concurrent学习(五) CompletionService,ExecutorCompletionService 代码认识
CompletionServiceCompletionService,一个顶层接口,主要用于将线程池中已完成的线程区分出来,从而提高批量执行任务的效率。该接口设计了五个方法:1.submit(Callable<V> task);提交Callable任务2.submit(Runnable task, V result);提交Runnable任务。3.take();获取下一...原创 2019-06-02 15:30:06 · 738 阅读 · 0 评论 -
java.util.concurrent学习(四) FutureTask
FutureTask是一个实现了RunnableFuture的任务类,而RunnableFuture又同时继承了Runable,Future接口,那么这就说明,FutureTask同时具备了Runable,Future的属性。FutureTask生命周期FutureTask内部维护了Callable<V> callable 需要执行的任务,Object outcome ...原创 2019-06-02 14:14:39 · 810 阅读 · 0 评论 -
java.util.concurrent学习(三) Future
Future是一个定义了包含一个任务取消以及返回结果获取等方法的接口,是所有java.util.concurrent包下实现任务的最基层的接口。他定义的方法有:1.boolean cancel(boolean mayInterruptIfRunning); 取消任务的执行,当参数mayInterruptIfRunning为false时,取消还没有开始执行的任务,已经开始执行的任务继续执行。当参...原创 2019-06-02 12:13:46 · 320 阅读 · 0 评论 -
java.util.concurrent学习(二) ExecutorService
ExecutorServiceExecturoService是对Executor的扩展接口,额外定义了线程池生面周期的相关方法。1.void shutdown(); 有序的关闭线程池,该方法只保证已提交的正在执行的任务执行完成,并不保证所有的已提交的任务都会执行完成,并且在这期间不再接受新的任务。多次调用并不会有额外的效果。2. List<Runnable> shutdo...原创 2019-06-01 18:34:16 · 238 阅读 · 0 评论 -
java.util.concurrent学习(一) Executor框架认识
concurrent包提供了一系列线程池执行框架,我们可以根据需求使用concurrent下的工具类和线程池,实现线程池,定时任务执行线程池,可返回结果线程等特别实用的业务代码,这给我们开发多线程提供了很大的便利。下面我们来认识一下这个多线程框架,首先看一下大致的框架结构图。Executor是executor框架的最顶层接口,该接口只定义了execute方法,并用Runnable来表...原创 2020-05-21 16:12:12 · 219 阅读 · 0 评论 -
ThreadPoolExecutor 构造参数说明
corePoolSize核心线程数,当一个新的任务提交时,如果线程池中的数量未达到核心线程数,会新起一个线程执行该任务,即使线程池中有空闲的线程。maximumPoolSize线程池中允许的最大线程数,包含包含核心线程和非核心线程。keepAliveTime当线程数超过核心线程数时,该参数规定了超过核心线程数的线程最大空闲时间。TimeUnit描述keepAliveTime的时间单位。BlockingQueue<Runnable>任务等待队列,当一个新的任务提原创 2020-10-19 10:13:53 · 247 阅读 · 0 评论 -
juc 之 CountDownLatch 倒数解锁
package com.tangjianghua.juc.class003_alllock;import java.util.ArrayList;import java.util.concurrent.CountDownLatch;/** * CountDownLatch:门闩,倒计时解锁 * await()阻塞当前线程,知道CountDownLatch减到0 * @author tangjianghua * date 2020/6/23 * time 11:50 */public.原创 2020-06-23 16:56:48 · 235 阅读 · 0 评论 -
juc 之 CyclicBarrier 栅栏
package com.tangjianghua.juc.class003_alllock;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;/** * CyclicBarrier:篱栅,栅栏 * 栅栏上绑定一个任务,当有足够的线程到达栅栏时,触发栅栏的任务。 * 多个线程通过栅栏,当有足够的线程到达栅栏的某一阶段时,栅栏的这个阶段放行。 * @auth.原创 2020-06-23 16:55:46 · 280 阅读 · 0 评论 -
juc 之 LockSupport 锁工具
public static void main(String[] args) { final Thread thread = new Thread(() -> { System.out.println("阻塞"); LockSupport.park(); System.out.println("已解锁"); }); thread.start(); try { .原创 2020-06-23 16:54:25 · 190 阅读 · 0 评论 -
juc 之 Exchanger 交换器 交换两个线程中的变量
package com.tangjianghua.juc.class003_alllock;import java.util.concurrent.Exchanger;/** * @author tangjianghua * date 2020/6/23 * time 16:48 */public class ExchangerTest { static Exchanger<String> exchanger = new Exchanger<>(); .原创 2020-06-23 16:51:21 · 212 阅读 · 0 评论 -
juc 之 Semaphore控制线程并发量
public static void main(String[] args) { //创建一个Semaphore,指定并发量为2,公平竞争 final Semaphore semaphore = new Semaphore(2, true); for (int i = 0; i < 10; i++) { new Thread(()->{ try { s.原创 2020-06-23 16:46:10 · 158 阅读 · 0 评论 -
juc之phaser阶段锁
package com.tangjianghua.juc.class003_alllock;import java.util.concurrent.Phaser;/** * Phaser 阶段锁 * 注册5个线程,分四个阶段完成 * @author tangjianghua * date 2020/6/23 * time 15:55 */public class PhaserTest { static final WarPhaser marriagePhaser = ...原创 2020-06-23 16:36:18 · 236 阅读 · 0 评论