死磕Java并发:Java内存模型之分析volatile
https://www.iocoder.cn/JUC/sike/jmm-2-volatile/ 前篇博客 《【死磕 Java 并发】—– 深入分析 volatile 的实现原理》 中已经阐述了 volatile 的特性了: volatile 可见性:对一个 volatile 的读,总可以看到对这个变量最终的写。 volatile 原子性:volatile 对单个读 / 写具有原...
https://www.iocoder.cn/JUC/sike/jmm-2-volatile/ 前篇博客 《【死磕 Java 并发】—– 深入分析 volatile 的实现原理》 中已经阐述了 volatile 的特性了: volatile 可见性:对一个 volatile 的读,总可以看到对这个变量最终的写。 volatile 原子性:volatile 对单个读 / 写具有原...
1. 问题分析 我们先看单例模式里面的懒汉式: 我们都知道这种写法是错误的,因为它无法保证线程的安全性。优化如下: 优化非常简单,就是在#getInstance()方法上面做了同步,但是synchronized就会导致这个方法比较低效,导致程序性能下降,那么怎么解决呢?聪明的人们想到了双重检查 DCL: 就如上面所示,这个代码看起来很完美,理由如下: 如果检查第一个singleto...
https://www.iocoder.cn/JUC/sike/happens-before/ 在上篇博客(《【死磕 Java 并发】—– 深入分析 volatile 的实现原理》)中,LZ 提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题。那么我们正确使用同步、锁的情况下,线程 A 修改了变量 a ,何时对线程 B 可见? 我们无法就所有场景来...
类图结构 ScheduledThreadPoolExecutor时一个可以在指定一定延迟时间后或者定时进行任务调度执行的线程池。 ScheduledThreadPoolExecutor继承了ThreadPoolExecutor并实现了ScheduledExecutorService接口。 线程池队列是DelayedWorkQueue,与DelayedQueue一样属于延迟队列。 ...
类图结构 如图所示,Executors是个工具类,用来提供不同特性的线程池。ThreadPoolExecutor中的ctl是一个原子变量,用来记录线程池状态和线程池中的线程个数,类似于ReentrantReadWriteLock中使用一个变量来保存两种信息。 以下为与ctl相关的变量与函数: private final AtomicInteger ctl = new AtomicI...
LinkedBlockingQueue和ArrayBlockingQueue比较简单,不进行讲解了。下面只介绍PriorityBlockingQueue和DelayQueue。 PriorityBlockingQueue PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或最低的元素。内部使用二叉堆实现。 类图结构 PriorityBlo...
LockSupport工具类 LockSupport是创建锁和其他同步类的基础。 LockSupport类与每个使用它的线程都会关联一个许可证,默认情况下调用LockSupport类的方法的线程是不持有许可证的。 下面介绍LockSupport类中的几个主要函数。 1. void park() 如果park方法拿到了与LockSupport关联的许可证,则调用LockSupport...
介绍 JUC包中的并发List只有CopyOnWriteArrayList。CopyOnWriteArrayList是一个线程安全的ArrayList,使用了写时复制策略,对其进行的修改操作都是在底层的一个复制的数组上进行的。 源码解析 初始化 CopyOnWriteArrayList内部包含一个array: /** The array, accessed only via get...
原子变量操作类 JUC包中有AtomicInteger、AtomicLong和AtomicBoolean等原子性操作类,它们原理类似,下面以AtomicLong为例进行讲解。 递增和递减操作代码 public final long getAndIncrement() { return unsafe.getAndAddLong(this, valueOffset, 1L); } ...
Random类及其局限性 一般情况下,我们都会使用java.util.Random来生成随机数(Math.random()也是使用Random实例生成随机数)。 示例 public static void main(String[] args) { Random random = new Random(); for (int i = 0; i < 10; i++)...