摘要: 前言 JDK 1.5 的 java.util.concurrent.locks 包中都是锁,其中有一个抽象类 AbstractQueuedSynchronizer (抽象队列同步器),也就是 AQS, 我们今天就来看看该类。 1.结构 我们看看该类的结构,该类被 CountDown,ThreadPo 阅读全文
posted @ 2018-05-19 23:07 莫那-鲁道 阅读(420) 评论(0) 推荐(0) 编辑
摘要: 前言 是一个普通用户不怎么常用的队列,通常在创建无界线程池( )的时候使用,也就是那个非常危险的线程池 。 它是一个非常特殊的阻塞队列,他的模式是:在 的时候,如果没有另一个线程在 take 或者 的话,就会失败,反之,如果在 或者 的时候,没有线程在 ,则也会失败,而这种特性,则非常适合用来做高响 阅读全文
posted @ 2018-05-19 23:07 莫那-鲁道 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 前言 在并发编程中,需要处理两个问题:线程之间如何通信及线程之间如何同步。通知是指线程之间以何种机制来交换信息。在命令式编程中, 线程之间的通信机制有两种:共享内存和消息传递 。 在共享内存的并发模型里,线程之间共享程序的公共状态,通过写 读内存中的公共状态进行隐式通信。而子啊消息传递的并发模型里, 阅读全文
posted @ 2018-05-19 23:06 莫那-鲁道 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 前言 “分而治之” 一直是一个有效的处理大量数据的方法。著名的 MapReduce 也是采取了分而治之的思想。简单来说,就是如果你要处理1000个数据,但是你并不具备处理1000个数据的能力,那么你可以只处理其中的10个,然后,分阶段处理100次,将100次的结果进行合成,那就是最终想要的对原始的1 阅读全文
posted @ 2018-05-19 23:05 莫那-鲁道 阅读(5697) 评论(0) 推荐(0) 编辑
摘要: 前言 今天我们继续分析 java 并发包的源码,今天的主角是谁呢?ConcurrentLinkedQueue,上次我们分析了并发下 ArrayList 的替代 CopyOnWriteArrayList,这次分析则是并发下 LinkedArrayList 的替代 ConcurrentLinkedQue 阅读全文
posted @ 2018-05-19 23:04 莫那-鲁道 阅读(891) 评论(5) 推荐(0) 编辑
摘要: 前言 JDK 1.5 之后,Doug Lea 大神为我们写了很多的工具,整个 concurrent 包基本都是他写的。也为我们程序员写好了很多工具,包括我们之前说的线程池,重入锁,线程协作工具,ConcurrentHashMap 等等,今天我们要讲的是和 ConcurrentHashMap 类似的数 阅读全文
posted @ 2018-05-19 23:03 莫那-鲁道 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 前言 ArrayList 是一个不安全的容器,在多线程调用 add 方法的时候会出现 ArrayIndexOutOfBoundsException 异常,而 Vector 虽然安全,但由于其 add 方法和 get 方法都使用了 synchronized 关键字,导致在并发时的性能令人担忧,因此,伟 阅读全文
posted @ 2018-05-19 23:03 莫那-鲁道 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 前言 首先看看 JDK 文档的描述: 该类提供了线程局部 (thread local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private stat 阅读全文
posted @ 2018-05-19 23:02 莫那-鲁道 阅读(288) 评论(0) 推荐(0) 编辑
摘要: 前言 在并发编程中,锁是消耗性能的操作,同一时间只能有一个线程进入同步块修改变量的值,比如下面的代码 如果不加 synchronized 的话,多线程修改 a 的值就会导致结果不正确,出现线程安全问题。但锁又是要给耗费性能的操作。不论是拿锁,解锁,还是等待锁,阻塞,都是非常耗费性能的。那么能不能不加 阅读全文
posted @ 2018-05-19 23:01 莫那-鲁道 阅读(7462) 评论(2) 推荐(0) 编辑
摘要: 前言 我们之前分析了Hash的源码,主要是 put 方法。同时,我们知道,HashMap 在并发的时候是不安全的,为什么呢?因为当多个线程对 Map 进行扩容会导致链表成环。不单单是这个问题,当多个线程相同一个槽中插入数据,也是不安全的。而在这之后,我们学习了并发编程,而并发编程中有一个重要的东西, 阅读全文
posted @ 2018-05-19 23:00 莫那-鲁道 阅读(506) 评论(0) 推荐(0) 编辑
摘要: 前言 在 JDK 1.6 之前,synchronized 性能令人担忧,但是 1.6 之后,JVM 团队针对 synchronized 做了很多的优化,让 synchroized 在性能层面相比较 ReentrantLock 不相上下。那么,JVM 团队做了哪些优化呢? 首先说,怎么才能优化?我们知 阅读全文
posted @ 2018-05-19 23:00 莫那-鲁道 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 前言 在上一篇文章中我们介绍了线程池的使用,那么现在我们有个疑问:线程池到底是怎么实现的?毕竟好奇是人类的天性。那我们今天就来看看吧,扒开 他的源码,一探究竟。 1. 从 Demo 入手 上图是个最简单的demo,我们从这个 demo 开始看源码,首先一步一步来看。 首先我们手动创建了线程池,使用了 阅读全文
posted @ 2018-05-19 21:17 莫那-鲁道 阅读(313) 评论(0) 推荐(0) 编辑
摘要: 前言 多线程的软件设计方法确实可以最大限度的发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能。但是,如果一个系统同时创建大量线程,线程间频繁的切换上下文导致的系统开销将会拖慢整个系统。严重的甚至导致内存耗尽导致OOM异常。因此,在实际的生产环境中,线程的数量必须得到控制,盲目的创建大量新车对 阅读全文
posted @ 2018-05-19 21:12 莫那-鲁道 阅读(443) 评论(0) 推荐(1) 编辑
摘要: 前言 在前面的文章中,我们介绍了并发工具中的4个,Samephore,CyclicBarrier,CountDownLatch,Exchanger,但是我们漏了一个,非常的好用的工具,楼主在这里必须加上。 LockSupport LockSupport 是一个非常方便实用的线程 阻塞 工具,他可以在 阅读全文
posted @ 2018-05-19 21:07 莫那-鲁道 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 前言 在并发编程的时候,Doug Lea 大师为我们准备了很多的工具,都在 JDK 1.5 版本后的java.util.concurrent 包下,今天楼主就和大家分享一些常用的线程协作的工具。 1. Semaphore 信号量 2. CountDownLatch 倒计时器 3. CyclicBar 阅读全文
posted @ 2018-05-19 21:02 莫那-鲁道 阅读(232) 评论(0) 推荐(1) 编辑
摘要: 前言 楼主这个标题其实有一种作死的味道,为什么呢,这三个东西其实可以分开为三篇文章来写,但是,楼主认为这三个东西又都是高度相关的,应当在一个知识点中。在一次学习中去理解这些东西。才能更好的理解 Java 内存模型和 volatile 关键字还有 HB 原则。 楼主今天就尝试着在一篇文章中讲述这三个问 阅读全文
posted @ 2018-05-19 21:01 莫那-鲁道 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 前言 今天我们继续学习并发。在之前我们学习了 JMM 的知识,知道了在并发编程中,为了保证线程的安全性,需要保证线程的原子性,可见性,有序性。其中,synchronized 高频出现,因为他既保证了原子性,也保证了可见性和有序性。为什么,因为 synchronized 是锁。通过锁,可以让原本并行的 阅读全文
posted @ 2018-05-19 21:01 莫那-鲁道 阅读(432) 评论(0) 推荐(1) 编辑
摘要: 前言 在 Java 刚诞生时,Thread 类就已经有了很多方法,但这些方法由于一些原因(有一些明显的bug或者设计不合理)有些已经废弃了,但是他们的方法名却是非常的好,真的是浪费。我们在进行并发必编程的时候一定要注意这些。 1. 过期方法1 stop 方法 2. 过期方法2 suspend 方法和 阅读全文
posted @ 2018-05-19 21:00 莫那-鲁道 阅读(395) 评论(0) 推荐(1) 编辑
摘要: 前言 2018 元旦快乐。 摘要: 1. notify wait 如何使用? 2. 为什么必须在同步块中? 3. 使用 notify wait 实现一个简单的生产者消费者模型 4. 底层实现原理 1. notify wait 如何使用? 今天我们要学习或者说分析的是 Object 类中的 wait 阅读全文
posted @ 2018-05-19 20:52 莫那-鲁道 阅读(3854) 评论(0) 推荐(0) 编辑
摘要: 前言 在 Java 的并发编程中,有一个问题需要特别注意,那就是死锁,如果发生了死锁,基本就是重启,而重启将会丢失运行中的数据。所以,了解死锁的形成并排查死锁到预防死锁成了一个重要的问题。 我们了解任何一个事情的步骤是:what,how,why,why not。 1. 什么是死锁? 我们还是直接写一 阅读全文
posted @ 2018-05-19 20:50 莫那-鲁道 阅读(428) 评论(0) 推荐(0) 编辑