摘要: 参考 :梁飞 "并发编程常识" 阅读全文
posted @ 2018-05-19 23:22 莫那-鲁道 阅读(450) 评论(0) 推荐(0) 编辑
摘要: 关于 Java 内存模型的类似思维导图。 如有错误,还请指正。 阅读全文
posted @ 2018-05-19 23:22 莫那-鲁道 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在前面的文章中,我们介绍了定时任务类 Timer ,他是 JDK 1.3 中出现的,位于 java.util 包下。而今天说的 的是在 JUC 包下,是 JDK1.5 新增的。 今天就来说说这个类。 2. API 介绍 该类内部结构和 还是有点类似的,也是 3 个类: :程序员使用的接口 阅读全文
posted @ 2018-05-19 23:21 莫那-鲁道 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 前言 在平时的开发中,肯定需要使用定时任务,而 Java 1.3 版本提供了一个 java.util.Timer 定时任务类。今天一起来看看这个类。 1.API 介绍 Timer 相关的有 3 个类: Timer :面向程序员的API 都在这个类中。 TaskQuue: 存储任务。 TimerThr 阅读全文
posted @ 2018-05-19 23:20 莫那-鲁道 阅读(323) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在前面的文章 "并发编程之——写锁源码分析" 中,我们分析了 1.8 JUC 中读写锁中的 写锁的获取和释放过程 ,今天来分析一下读锁的获取和释放过程,读锁相比较写锁要稍微复杂一点,其中还有一点有争议的地方——锁降级。 今天就来解开迷雾。 2. 获取读锁 tryAcquireShared 阅读全文
posted @ 2018-05-19 23:18 莫那-鲁道 阅读(576) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 当我们在 Java 中使用异步编程的时候,大部分时候,我们都会使用 Future,并且使用线程池的 submit 方法提交一个 Callable 对象。然后调用 Future 的 get 方法等待返回值。而 FutureTask 是 Future 的一个实现,也是我们今天的主角。 我们就 阅读全文
posted @ 2018-05-19 23:18 莫那-鲁道 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在并发编程中,异步回调的效率不言而喻,在业务开发中,如果由阻塞的任务需要执行,必然要使用异步线程。并且,如果我们想在异步执行之后,根据他的结果执行一些动作。 JDK 8 之前的 Future 只能解决上面需求的一半问题,即异步执行,返回一个 Future,需要程序员调用 get 方法等待 阅读全文
posted @ 2018-05-19 23:16 莫那-鲁道 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 1.前言 Java 中的读写锁实现是 ReentrantReadWriteLock ,是一种锁分离策略。能有效提高读比写多的场景下的程序性能。 关于如何使用参见 "并发编程之 Java 三把锁" 。 由于读写锁较为复杂,故分为篇文章进行源码分析,今天先说较为简单的写锁。 2. 写锁介绍 不论是读锁还 阅读全文
posted @ 2018-05-19 23:16 莫那-鲁道 阅读(219) 评论(1) 推荐(1) 编辑
摘要: 前言 ConcurrentHashMap 博大精深,从他的 50 多个内部类就能看出来,似乎 JDK 的并发精髓都在里面了。但他依然拥有体验良好的 API 给我们使用,程序员根本感觉不到他内部的复杂。但,他内部的每一个方法都复杂无比,就连 size 方法,都挺复杂的。 今天就一起来看看这个 size 阅读全文
posted @ 2018-05-19 23:14 莫那-鲁道 阅读(7993) 评论(0) 推荐(3) 编辑
摘要: 前言 ReentrantLock 提供了公平锁和非公平锁,只需要在构造方法中使用一个 参数即可。默认非公平锁。 今天从源码层面看看区别和具体实现。 1. 类 UML 图 内部有一个抽象类 ,继承了 AQS。 而公平锁的实现就是 ,非公平锁的实现就是 。 两把锁的区别在于 方法的实现。 2. 公平锁 阅读全文
posted @ 2018-05-19 23:13 莫那-鲁道 阅读(608) 评论(0) 推荐(0) 编辑
摘要: 1. 从 acquire 方法开始 —— 获取 2. 为什么 AQS 需要一个虚拟 head 节点 3. reelase 方法如何释放锁 4. 总结 前言 AQS 是 JUC 中的核心,其中封装了资源的获取和释放,在我们之前的 "并发编程之 AQS 源码剖析" 文章中,我们已经从 ReentranL 阅读全文
posted @ 2018-05-19 23:12 莫那-鲁道 阅读(993) 评论(0) 推荐(0) 编辑
摘要: 前言 并发 JUC 包提供了很多工具类,比如之前说的 CountDownLatch,CyclicBarrier ,今天说说这个 Semaphore——信号量,关于他的使用请查看往期文章 "并发编程之 线程协作工具类" ,今天的任务就是从源码层面分析一下他的原理。 源码分析 如果先不看源码,根据以往我 阅读全文
posted @ 2018-05-19 23:11 莫那-鲁道 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 前言 JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要的工具,只不过相对而言使用的不多,什么呢? Exchange —— 交换器。用于在两个线程之间交换数据,A 线程将 a 数据交给 B 线程,B 线程将 b 数据交给 a 线程。 具 阅读全文
posted @ 2018-05-19 23:11 莫那-鲁道 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 前言 在之前的介绍 CountDownLatch 的文章中,CountDown 可以实现多个线程协调,在所有指定线程完成后,主线程才执行任务。 但是,CountDownLatch 有个缺陷,这点 JDK 的文档中也说了:他只能使用一次。在有些场合,似乎有些浪费,需要不停的创建 CountDownLa 阅读全文
posted @ 2018-05-19 23:10 莫那-鲁道 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 前言 从之前的阻塞队列的源码分析中,我们知道,JDK 中的阻塞队列是使用 ReentrantLock 和 Condition 实现了,我们今天来个简易版的。代码如下: 代码 其实,这并不是我写的,而是 Condition 接口的 JavaDoc 文档中写的。并且文档中说,请不要再次实现这个队列,因为 阅读全文
posted @ 2018-05-19 23:09 莫那-鲁道 阅读(1246) 评论(0) 推荐(0) 编辑
摘要: 前言 Condition 是 Lock 的伴侣,至于如何使用,我们之前也写了一些文章来说,例如 "使用 ReentrantLock 和 Condition 实现一个阻塞队列" , "并发编程之 Java 三把锁" , 在这两篇文章中,我们都详细介绍了他们的使用。今天我们就来深入看看源码实现。 构造方 阅读全文
posted @ 2018-05-19 23:09 莫那-鲁道 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 前言 Doug Lea 大神在 JUC 包中为我们准备了大量的多线程工具,其中包括 CountDownLatch ,名为 ,好像不太好理解。不过,今天的文章之后,我们就彻底理解了。 如何使用? 在 JDK 的文档中,带有 2 个例子,我们使用其中一个,测试代码如下: await 方法调用的是 Syn 阅读全文
posted @ 2018-05-19 23:08 莫那-鲁道 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 前言 JDK 1.5 的 java.util.concurrent.locks 包中都是锁,其中有一个抽象类 AbstractQueuedSynchronizer (抽象队列同步器),也就是 AQS, 我们今天就来看看该类。 1.结构 我们看看该类的结构,该类被 CountDown,ThreadPo 阅读全文
posted @ 2018-05-19 23:07 莫那-鲁道 阅读(370) 评论(0) 推荐(0) 编辑
摘要: 前言 是一个普通用户不怎么常用的队列,通常在创建无界线程池( )的时候使用,也就是那个非常危险的线程池 。 它是一个非常特殊的阻塞队列,他的模式是:在 的时候,如果没有另一个线程在 take 或者 的话,就会失败,反之,如果在 或者 的时候,没有线程在 ,则也会失败,而这种特性,则非常适合用来做高响 阅读全文
posted @ 2018-05-19 23:07 莫那-鲁道 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 前言 在并发编程中,需要处理两个问题:线程之间如何通信及线程之间如何同步。通知是指线程之间以何种机制来交换信息。在命令式编程中, 线程之间的通信机制有两种:共享内存和消息传递 。 在共享内存的并发模型里,线程之间共享程序的公共状态,通过写 读内存中的公共状态进行隐式通信。而子啊消息传递的并发模型里, 阅读全文
posted @ 2018-05-19 23:06 莫那-鲁道 阅读(194) 评论(0) 推荐(0) 编辑