随笔分类 -  并发编程

摘要:1. 从 acquire 方法开始 —— 获取 2. 为什么 AQS 需要一个虚拟 head 节点 3. reelase 方法如何释放锁 4. 总结 前言 AQS 是 JUC 中的核心,其中封装了资源的获取和释放,在我们之前的 "并发编程之 AQS 源码剖析" 文章中,我们已经从 ReentranL 阅读全文
posted @ 2018-05-19 23:12 莫那-鲁道 阅读(1172) 评论(0) 推荐(0) 编辑
摘要:前言 并发 JUC 包提供了很多工具类,比如之前说的 CountDownLatch,CyclicBarrier ,今天说说这个 Semaphore——信号量,关于他的使用请查看往期文章 "并发编程之 线程协作工具类" ,今天的任务就是从源码层面分析一下他的原理。 源码分析 如果先不看源码,根据以往我 阅读全文
posted @ 2018-05-19 23:11 莫那-鲁道 阅读(309) 评论(0) 推荐(0) 编辑
摘要:前言 JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要的工具,只不过相对而言使用的不多,什么呢? Exchange —— 交换器。用于在两个线程之间交换数据,A 线程将 a 数据交给 B 线程,B 线程将 b 数据交给 a 线程。 具 阅读全文
posted @ 2018-05-19 23:11 莫那-鲁道 阅读(185) 评论(0) 推荐(0) 编辑
摘要:前言 在之前的介绍 CountDownLatch 的文章中,CountDown 可以实现多个线程协调,在所有指定线程完成后,主线程才执行任务。 但是,CountDownLatch 有个缺陷,这点 JDK 的文档中也说了:他只能使用一次。在有些场合,似乎有些浪费,需要不停的创建 CountDownLa 阅读全文
posted @ 2018-05-19 23:10 莫那-鲁道 阅读(199) 评论(0) 推荐(0) 编辑
摘要:前言 从之前的阻塞队列的源码分析中,我们知道,JDK 中的阻塞队列是使用 ReentrantLock 和 Condition 实现了,我们今天来个简易版的。代码如下: 代码 其实,这并不是我写的,而是 Condition 接口的 JavaDoc 文档中写的。并且文档中说,请不要再次实现这个队列,因为 阅读全文
posted @ 2018-05-19 23:09 莫那-鲁道 阅读(1374) 评论(0) 推荐(0) 编辑
摘要:前言 Condition 是 Lock 的伴侣,至于如何使用,我们之前也写了一些文章来说,例如 "使用 ReentrantLock 和 Condition 实现一个阻塞队列" , "并发编程之 Java 三把锁" , 在这两篇文章中,我们都详细介绍了他们的使用。今天我们就来深入看看源码实现。 构造方 阅读全文
posted @ 2018-05-19 23:09 莫那-鲁道 阅读(306) 评论(0) 推荐(0) 编辑
摘要:前言 Doug Lea 大神在 JUC 包中为我们准备了大量的多线程工具,其中包括 CountDownLatch ,名为 ,好像不太好理解。不过,今天的文章之后,我们就彻底理解了。 如何使用? 在 JDK 的文档中,带有 2 个例子,我们使用其中一个,测试代码如下: await 方法调用的是 Syn 阅读全文
posted @ 2018-05-19 23:08 莫那-鲁道 阅读(389) 评论(0) 推荐(0) 编辑
摘要:前言 JDK 1.5 的 java.util.concurrent.locks 包中都是锁,其中有一个抽象类 AbstractQueuedSynchronizer (抽象队列同步器),也就是 AQS, 我们今天就来看看该类。 1.结构 我们看看该类的结构,该类被 CountDown,ThreadPo 阅读全文
posted @ 2018-05-19 23:07 莫那-鲁道 阅读(441) 评论(0) 推荐(0) 编辑
摘要:前言 是一个普通用户不怎么常用的队列,通常在创建无界线程池( )的时候使用,也就是那个非常危险的线程池 。 它是一个非常特殊的阻塞队列,他的模式是:在 的时候,如果没有另一个线程在 take 或者 的话,就会失败,反之,如果在 或者 的时候,没有线程在 ,则也会失败,而这种特性,则非常适合用来做高响 阅读全文
posted @ 2018-05-19 23:07 莫那-鲁道 阅读(298) 评论(0) 推荐(0) 编辑
摘要:前言 在并发编程中,需要处理两个问题:线程之间如何通信及线程之间如何同步。通知是指线程之间以何种机制来交换信息。在命令式编程中, 线程之间的通信机制有两种:共享内存和消息传递 。 在共享内存的并发模型里,线程之间共享程序的公共状态,通过写 读内存中的公共状态进行隐式通信。而子啊消息传递的并发模型里, 阅读全文
posted @ 2018-05-19 23:06 莫那-鲁道 阅读(228) 评论(0) 推荐(0) 编辑
摘要:前言 “分而治之” 一直是一个有效的处理大量数据的方法。著名的 MapReduce 也是采取了分而治之的思想。简单来说,就是如果你要处理1000个数据,但是你并不具备处理1000个数据的能力,那么你可以只处理其中的10个,然后,分阶段处理100次,将100次的结果进行合成,那就是最终想要的对原始的1 阅读全文
posted @ 2018-05-19 23:05 莫那-鲁道 阅读(5737) 评论(0) 推荐(0) 编辑
摘要:前言 今天我们继续分析 java 并发包的源码,今天的主角是谁呢?ConcurrentLinkedQueue,上次我们分析了并发下 ArrayList 的替代 CopyOnWriteArrayList,这次分析则是并发下 LinkedArrayList 的替代 ConcurrentLinkedQue 阅读全文
posted @ 2018-05-19 23:04 莫那-鲁道 阅读(904) 评论(5) 推荐(0) 编辑
摘要:前言 JDK 1.5 之后,Doug Lea 大神为我们写了很多的工具,整个 concurrent 包基本都是他写的。也为我们程序员写好了很多工具,包括我们之前说的线程池,重入锁,线程协作工具,ConcurrentHashMap 等等,今天我们要讲的是和 ConcurrentHashMap 类似的数 阅读全文
posted @ 2018-05-19 23:03 莫那-鲁道 阅读(216) 评论(0) 推荐(0) 编辑
摘要:前言 ArrayList 是一个不安全的容器,在多线程调用 add 方法的时候会出现 ArrayIndexOutOfBoundsException 异常,而 Vector 虽然安全,但由于其 add 方法和 get 方法都使用了 synchronized 关键字,导致在并发时的性能令人担忧,因此,伟 阅读全文
posted @ 2018-05-19 23:03 莫那-鲁道 阅读(162) 评论(0) 推荐(0) 编辑
摘要:前言 首先看看 JDK 文档的描述: 该类提供了线程局部 (thread local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private stat 阅读全文
posted @ 2018-05-19 23:02 莫那-鲁道 阅读(297) 评论(0) 推荐(0) 编辑
摘要:前言 在并发编程中,锁是消耗性能的操作,同一时间只能有一个线程进入同步块修改变量的值,比如下面的代码 如果不加 synchronized 的话,多线程修改 a 的值就会导致结果不正确,出现线程安全问题。但锁又是要给耗费性能的操作。不论是拿锁,解锁,还是等待锁,阻塞,都是非常耗费性能的。那么能不能不加 阅读全文
posted @ 2018-05-19 23:01 莫那-鲁道 阅读(7522) 评论(2) 推荐(0) 编辑
摘要:前言 我们之前分析了Hash的源码,主要是 put 方法。同时,我们知道,HashMap 在并发的时候是不安全的,为什么呢?因为当多个线程对 Map 进行扩容会导致链表成环。不单单是这个问题,当多个线程相同一个槽中插入数据,也是不安全的。而在这之后,我们学习了并发编程,而并发编程中有一个重要的东西, 阅读全文
posted @ 2018-05-19 23:00 莫那-鲁道 阅读(520) 评论(0) 推荐(0) 编辑
摘要:前言 在 JDK 1.6 之前,synchronized 性能令人担忧,但是 1.6 之后,JVM 团队针对 synchronized 做了很多的优化,让 synchroized 在性能层面相比较 ReentrantLock 不相上下。那么,JVM 团队做了哪些优化呢? 首先说,怎么才能优化?我们知 阅读全文
posted @ 2018-05-19 23:00 莫那-鲁道 阅读(212) 评论(0) 推荐(0) 编辑
摘要:前言 在上一篇文章中我们介绍了线程池的使用,那么现在我们有个疑问:线程池到底是怎么实现的?毕竟好奇是人类的天性。那我们今天就来看看吧,扒开 他的源码,一探究竟。 1. 从 Demo 入手 上图是个最简单的demo,我们从这个 demo 开始看源码,首先一步一步来看。 首先我们手动创建了线程池,使用了 阅读全文
posted @ 2018-05-19 21:17 莫那-鲁道 阅读(322) 评论(0) 推荐(0) 编辑
摘要:前言 多线程的软件设计方法确实可以最大限度的发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能。但是,如果一个系统同时创建大量线程,线程间频繁的切换上下文导致的系统开销将会拖慢整个系统。严重的甚至导致内存耗尽导致OOM异常。因此,在实际的生产环境中,线程的数量必须得到控制,盲目的创建大量新车对 阅读全文
posted @ 2018-05-19 21:12 莫那-鲁道 阅读(470) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示