摘要: 前言 RPC 服务中,每个服务的容量都是有限的,即资源有限,只能承受住给定的网络请求,所以,在设计 RPC 框架的时候,一定要考虑流量控制这个问题。而 Java 中,实现流量控制有很多中方式,今天说 2 种。 Semaphore 实现流控 代码: 这段代码和上面的类似,只是使用的 API 不同,这里 阅读全文
posted @ 2018-05-19 23:23 莫那-鲁道 阅读(929) 评论(0) 推荐(0) 编辑
摘要: 前言 如何中断一个线程,肯定不会使用 stop。而是使用 interrupt 方法。同时,我们知道,中断一个线程只是打个标志位。不会真的中断线程,但,如果线程是阻塞状态的呢? 而 Java 中,想要阻塞一个线程有很多种方式。 1. synchronized 2. Object.wait() 3. L 阅读全文
posted @ 2018-05-19 23:23 莫那-鲁道 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 Java 中总的算起来有 8 种阻塞队列。 我们分析了: "并发编程之 SynchronousQueue 核心源码分析" "并发编程之 ConcurrentLinkedQueue 源码剖析" "并发编程之 LinkedBolckingQueue 源码剖析" 在 "并发编程 —— Sche 阅读全文
posted @ 2018-05-19 23:22 莫那-鲁道 阅读(4037) 评论(0) 推荐(2) 编辑
摘要: 参考 :梁飞 "并发编程常识" 阅读全文
posted @ 2018-05-19 23:22 莫那-鲁道 阅读(518) 评论(0) 推荐(0) 编辑
摘要: 关于 Java 内存模型的类似思维导图。 如有错误,还请指正。 阅读全文
posted @ 2018-05-19 23:22 莫那-鲁道 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在前面的文章中,我们介绍了定时任务类 Timer ,他是 JDK 1.3 中出现的,位于 java.util 包下。而今天说的 的是在 JUC 包下,是 JDK1.5 新增的。 今天就来说说这个类。 2. API 介绍 该类内部结构和 还是有点类似的,也是 3 个类: :程序员使用的接口 阅读全文
posted @ 2018-05-19 23:21 莫那-鲁道 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 前言 在平时的开发中,肯定需要使用定时任务,而 Java 1.3 版本提供了一个 java.util.Timer 定时任务类。今天一起来看看这个类。 1.API 介绍 Timer 相关的有 3 个类: Timer :面向程序员的API 都在这个类中。 TaskQuue: 存储任务。 TimerThr 阅读全文
posted @ 2018-05-19 23:20 莫那-鲁道 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在前面的文章 "并发编程之——写锁源码分析" 中,我们分析了 1.8 JUC 中读写锁中的 写锁的获取和释放过程 ,今天来分析一下读锁的获取和释放过程,读锁相比较写锁要稍微复杂一点,其中还有一点有争议的地方——锁降级。 今天就来解开迷雾。 2. 获取读锁 tryAcquireShared 阅读全文
posted @ 2018-05-19 23:18 莫那-鲁道 阅读(773) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 当我们在 Java 中使用异步编程的时候,大部分时候,我们都会使用 Future,并且使用线程池的 submit 方法提交一个 Callable 对象。然后调用 Future 的 get 方法等待返回值。而 FutureTask 是 Future 的一个实现,也是我们今天的主角。 我们就 阅读全文
posted @ 2018-05-19 23:18 莫那-鲁道 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在并发编程中,异步回调的效率不言而喻,在业务开发中,如果由阻塞的任务需要执行,必然要使用异步线程。并且,如果我们想在异步执行之后,根据他的结果执行一些动作。 JDK 8 之前的 Future 只能解决上面需求的一半问题,即异步执行,返回一个 Future,需要程序员调用 get 方法等待 阅读全文
posted @ 2018-05-19 23:16 莫那-鲁道 阅读(339) 评论(0) 推荐(0) 编辑
摘要: 1.前言 Java 中的读写锁实现是 ReentrantReadWriteLock ,是一种锁分离策略。能有效提高读比写多的场景下的程序性能。 关于如何使用参见 "并发编程之 Java 三把锁" 。 由于读写锁较为复杂,故分为篇文章进行源码分析,今天先说较为简单的写锁。 2. 写锁介绍 不论是读锁还 阅读全文
posted @ 2018-05-19 23:16 莫那-鲁道 阅读(251) 评论(1) 推荐(1) 编辑
摘要: 前言 ConcurrentHashMap 博大精深,从他的 50 多个内部类就能看出来,似乎 JDK 的并发精髓都在里面了。但他依然拥有体验良好的 API 给我们使用,程序员根本感觉不到他内部的复杂。但,他内部的每一个方法都复杂无比,就连 size 方法,都挺复杂的。 今天就一起来看看这个 size 阅读全文
posted @ 2018-05-19 23:14 莫那-鲁道 阅读(8592) 评论(0) 推荐(3) 编辑
摘要: 前言 ReentrantLock 提供了公平锁和非公平锁,只需要在构造方法中使用一个 参数即可。默认非公平锁。 今天从源码层面看看区别和具体实现。 1. 类 UML 图 内部有一个抽象类 ,继承了 AQS。 而公平锁的实现就是 ,非公平锁的实现就是 。 两把锁的区别在于 方法的实现。 2. 公平锁 阅读全文
posted @ 2018-05-19 23:13 莫那-鲁道 阅读(639) 评论(0) 推荐(0) 编辑
摘要: 1. 从 acquire 方法开始 —— 获取 2. 为什么 AQS 需要一个虚拟 head 节点 3. reelase 方法如何释放锁 4. 总结 前言 AQS 是 JUC 中的核心,其中封装了资源的获取和释放,在我们之前的 "并发编程之 AQS 源码剖析" 文章中,我们已经从 ReentranL 阅读全文
posted @ 2018-05-19 23:12 莫那-鲁道 阅读(1155) 评论(0) 推荐(0) 编辑
摘要: 前言 并发 JUC 包提供了很多工具类,比如之前说的 CountDownLatch,CyclicBarrier ,今天说说这个 Semaphore——信号量,关于他的使用请查看往期文章 "并发编程之 线程协作工具类" ,今天的任务就是从源码层面分析一下他的原理。 源码分析 如果先不看源码,根据以往我 阅读全文
posted @ 2018-05-19 23:11 莫那-鲁道 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 前言 JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要的工具,只不过相对而言使用的不多,什么呢? Exchange —— 交换器。用于在两个线程之间交换数据,A 线程将 a 数据交给 B 线程,B 线程将 b 数据交给 a 线程。 具 阅读全文
posted @ 2018-05-19 23:11 莫那-鲁道 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 前言 在之前的介绍 CountDownLatch 的文章中,CountDown 可以实现多个线程协调,在所有指定线程完成后,主线程才执行任务。 但是,CountDownLatch 有个缺陷,这点 JDK 的文档中也说了:他只能使用一次。在有些场合,似乎有些浪费,需要不停的创建 CountDownLa 阅读全文
posted @ 2018-05-19 23:10 莫那-鲁道 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 前言 从之前的阻塞队列的源码分析中,我们知道,JDK 中的阻塞队列是使用 ReentrantLock 和 Condition 实现了,我们今天来个简易版的。代码如下: 代码 其实,这并不是我写的,而是 Condition 接口的 JavaDoc 文档中写的。并且文档中说,请不要再次实现这个队列,因为 阅读全文
posted @ 2018-05-19 23:09 莫那-鲁道 阅读(1357) 评论(0) 推荐(0) 编辑
摘要: 前言 Condition 是 Lock 的伴侣,至于如何使用,我们之前也写了一些文章来说,例如 "使用 ReentrantLock 和 Condition 实现一个阻塞队列" , "并发编程之 Java 三把锁" , 在这两篇文章中,我们都详细介绍了他们的使用。今天我们就来深入看看源码实现。 构造方 阅读全文
posted @ 2018-05-19 23:09 莫那-鲁道 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 前言 Doug Lea 大神在 JUC 包中为我们准备了大量的多线程工具,其中包括 CountDownLatch ,名为 ,好像不太好理解。不过,今天的文章之后,我们就彻底理解了。 如何使用? 在 JDK 的文档中,带有 2 个例子,我们使用其中一个,测试代码如下: await 方法调用的是 Syn 阅读全文
posted @ 2018-05-19 23:08 莫那-鲁道 阅读(382) 评论(0) 推荐(0) 编辑