随笔分类 - JUC
摘要:【转载】Java并发面试系列:彻底掌握 volatile 关键字原理 什么是 volatile volatile 是 Java 中的一种轻量级同步机制的关键字,当一个变量被 volatile 修饰后,有两层含义: 保证了该变量的修改对所有线程可见 禁止指令重排序优化 另外,volatile 不保证原
阅读全文
摘要:JAVA线程池 submit方法返回值 AbstractExecutorService public abstract class AbstractExecutorService implements ExecutorService { // RunnableFuture 是用于获取执行结果的,我们
阅读全文
摘要:JAVA线程-interrupt 中断一个线程非常简单,只需要在其他线程中对目标线程调用interrupt()方法,目标线程需要反复检测自身状态是否是interrupted状态,如果是,就立刻结束运行。 案例一: public class Main { public static void main
阅读全文
摘要:【转载】硬核干货:5W字17张高清图理解同步器框架AbstractQueuedSynchronizer 前提 并发编程大师Doug Lea在编写JUC(java.util.concurrent)包的时候引入了java.util.concurrent.locks.AbstractQueuedSynch
阅读全文
摘要:【转载】ThreadLocal源码分析-黄金分割数的使用 前提 最近接触到的一个项目要兼容新老系统,最终采用了ThreadLocal(实际上用的是InheritableThreadLocal)用于在子线程获取父线程中共享的变量。问题是解决了,但是后来发现对ThreadLocal的理解不够深入,于是顺
阅读全文
摘要:【转载】通过transmittable-thread-local源码理解线程池线程本地变量传递的原理 前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文。想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不
阅读全文
摘要:【转载】硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理 前提 很早之前就打算看一次JUC线程池ThreadPoolExecutor的源码实现,由于近段时间比较忙,一直没有时间整理出源码分析的文章。之前在分析扩展线程池实现可回调的Future时候曾经提到并发大师
阅读全文
摘要:JAVA并发-Disruptor框架 Disruptor简介 最好的方法去理解Disruptor就是将它和容易理解并且相似的队列,例如BlockingQueue。Disruptor其实就像一个队列一样,用于在不同的线程之间迁移数据,但是Disruptor也实现了一些其他队列没有的特性,如: 同一个“
阅读全文
摘要:简介 ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。 Java7 提供了ForkJoinPool来支持将一个任务拆分成多个“小任务”
阅读全文
摘要:【转载】Java线程生命周期与状态切换 前提 最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的JDK版本是11。 Java线程的实现 在JDK1.2
阅读全文
摘要:ThreadLocal结构 下图是本文介绍到的一些对象之间的引用关系图,实线表示强引用,虚线表示弱引用: ThreadLocal的hashcode 在ThreadLocalMap中都需要根据索引i来get,set int i = key.threadLocalHashCode & (len-1);
阅读全文
摘要:转载地址: "逐行分析AQS源码(3)——共享锁的获取与释放" 前言 前面两篇我们以ReentrantLock为例了解了AQS独占锁的 "获取" 与 "释放" ,本篇我们来看看共享锁。由于AQS对于共享锁与独占锁的实现框架比较类似,因此如果你搞定了前面的独占锁模式,则共享锁也就很容易弄懂了。 "系列
阅读全文
摘要:案例 ,这里将会新增两个node 第一轮循环创建一个 ,空节点,线程也为空 第二轮将 加入到队列中,prev指向head 在最后一次release之前,tryAcquireShared会为 1 shouldParkAfterFailedAcquire parkAndCheckInterrupt(阻塞
阅读全文
摘要:源码: 内部类Sync CountDownLatch初始化 private void doAcquireSharedInterruptibly(int arg) throws InterruptedException { final Node node = addWaiter(Node.SHARED
阅读全文
摘要:结构 类继承图: 上面的各个接口/类的关系和作用: Executor 执行器接口,也是最顶层的抽象核心接口, 分离了任务和任务的执行。 ExecutorService 在Executor的基础上提供了执行器生命周期管理,任务异步执行等功能。 ScheduledExecutorService 在Exe
阅读全文
摘要:总览 开篇来一些废话。下图是 java 线程池几个相关类的继承结构: 先简单说说这个继承结构,Executor 位于最顶层,也是最简单的,就一个 execute(Runnable runnable) 接口方法定义。 ExecutorService 也是接口,在 Executor 接口的基础上添加了很
阅读全文
摘要:简介 读写锁维护着一对锁,一个读锁和一个写锁。通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时间可以允许多个读线程同时访问,但是在写线程访问时,所有读线程和写线程都会被阻塞。 读写锁的主要特性: 公平性:支持公平性和非公平性。 重入性:支持重入。读写锁最多支持65535个递归写入
阅读全文
摘要:简介 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait()、notify()系列方法可以实现等待/通知模式。在Java SE5后,Java提供了Lock接口,相对于Synchronized而言,Lock提供了条件Condition,对线程的等待、唤醒操作更加
阅读全文
摘要:JAVA对象方法-wait 最简单的东西,往往包含了最复杂的实现,因为需要为上层的存在提供一个稳定的基础,Object作为java中所有对象的基类,其存在的价值不言而喻,其中wait和notify方法的实现多线程协作提供了保证。 案例 public class WaitTestDemo { publ
阅读全文
摘要:概念 join方法,一种特殊的wait,当前运行线程调用另一个线程的join方法,当前线程进入阻塞状态直到调用join方法的线程结束,再继续执行。 一般情况下,都是主线程创建一个子线程,子线程调用join方法,主线程会进入阻塞状态,直到子线程运行结束。 简单案例 public class JoinT
阅读全文