摘要: 前言 “分而治之” 一直是一个有效的处理大量数据的方法。著名的 MapReduce 也是采取了分而治之的思想。简单来说,就是如果你要处理1000个数据,但是你并不具备处理1000个数据的能力,那么你可以只处理其中的10个,然后,分阶段处理100次,将100次的结果进行合成,那就是最终想要的对原始的1 阅读全文
posted @ 2018-05-19 23:05 莫那-鲁道 阅读(5526) 评论(0) 推荐(0) 编辑
摘要: 前言 今天我们继续分析 java 并发包的源码,今天的主角是谁呢?ConcurrentLinkedQueue,上次我们分析了并发下 ArrayList 的替代 CopyOnWriteArrayList,这次分析则是并发下 LinkedArrayList 的替代 ConcurrentLinkedQue 阅读全文
posted @ 2018-05-19 23:04 莫那-鲁道 阅读(864) 评论(5) 推荐(0) 编辑
摘要: 前言 JDK 1.5 之后,Doug Lea 大神为我们写了很多的工具,整个 concurrent 包基本都是他写的。也为我们程序员写好了很多工具,包括我们之前说的线程池,重入锁,线程协作工具,ConcurrentHashMap 等等,今天我们要讲的是和 ConcurrentHashMap 类似的数 阅读全文
posted @ 2018-05-19 23:03 莫那-鲁道 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 前言 ArrayList 是一个不安全的容器,在多线程调用 add 方法的时候会出现 ArrayIndexOutOfBoundsException 异常,而 Vector 虽然安全,但由于其 add 方法和 get 方法都使用了 synchronized 关键字,导致在并发时的性能令人担忧,因此,伟 阅读全文
posted @ 2018-05-19 23:03 莫那-鲁道 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 前言 首先看看 JDK 文档的描述: 该类提供了线程局部 (thread local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private stat 阅读全文
posted @ 2018-05-19 23:02 莫那-鲁道 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 前言 在并发编程中,锁是消耗性能的操作,同一时间只能有一个线程进入同步块修改变量的值,比如下面的代码 如果不加 synchronized 的话,多线程修改 a 的值就会导致结果不正确,出现线程安全问题。但锁又是要给耗费性能的操作。不论是拿锁,解锁,还是等待锁,阻塞,都是非常耗费性能的。那么能不能不加 阅读全文
posted @ 2018-05-19 23:01 莫那-鲁道 阅读(7219) 评论(2) 推荐(0) 编辑
摘要: 前言 我们之前分析了Hash的源码,主要是 put 方法。同时,我们知道,HashMap 在并发的时候是不安全的,为什么呢?因为当多个线程对 Map 进行扩容会导致链表成环。不单单是这个问题,当多个线程相同一个槽中插入数据,也是不安全的。而在这之后,我们学习了并发编程,而并发编程中有一个重要的东西, 阅读全文
posted @ 2018-05-19 23:00 莫那-鲁道 阅读(463) 评论(0) 推荐(0) 编辑
摘要: 前言 在 JDK 1.6 之前,synchronized 性能令人担忧,但是 1.6 之后,JVM 团队针对 synchronized 做了很多的优化,让 synchroized 在性能层面相比较 ReentrantLock 不相上下。那么,JVM 团队做了哪些优化呢? 首先说,怎么才能优化?我们知 阅读全文
posted @ 2018-05-19 23:00 莫那-鲁道 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 前言 在上一篇文章中我们介绍了线程池的使用,那么现在我们有个疑问:线程池到底是怎么实现的?毕竟好奇是人类的天性。那我们今天就来看看吧,扒开 他的源码,一探究竟。 1. 从 Demo 入手 上图是个最简单的demo,我们从这个 demo 开始看源码,首先一步一步来看。 首先我们手动创建了线程池,使用了 阅读全文
posted @ 2018-05-19 21:17 莫那-鲁道 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 前言 多线程的软件设计方法确实可以最大限度的发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能。但是,如果一个系统同时创建大量线程,线程间频繁的切换上下文导致的系统开销将会拖慢整个系统。严重的甚至导致内存耗尽导致OOM异常。因此,在实际的生产环境中,线程的数量必须得到控制,盲目的创建大量新车对 阅读全文
posted @ 2018-05-19 21:12 莫那-鲁道 阅读(359) 评论(0) 推荐(1) 编辑
摘要: 前言 在前面的文章中,我们介绍了并发工具中的4个,Samephore,CyclicBarrier,CountDownLatch,Exchanger,但是我们漏了一个,非常的好用的工具,楼主在这里必须加上。 LockSupport LockSupport 是一个非常方便实用的线程 阻塞 工具,他可以在 阅读全文
posted @ 2018-05-19 21:07 莫那-鲁道 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 前言 在并发编程的时候,Doug Lea 大师为我们准备了很多的工具,都在 JDK 1.5 版本后的java.util.concurrent 包下,今天楼主就和大家分享一些常用的线程协作的工具。 1. Semaphore 信号量 2. CountDownLatch 倒计时器 3. CyclicBar 阅读全文
posted @ 2018-05-19 21:02 莫那-鲁道 阅读(200) 评论(0) 推荐(1) 编辑
摘要: 前言 楼主这个标题其实有一种作死的味道,为什么呢,这三个东西其实可以分开为三篇文章来写,但是,楼主认为这三个东西又都是高度相关的,应当在一个知识点中。在一次学习中去理解这些东西。才能更好的理解 Java 内存模型和 volatile 关键字还有 HB 原则。 楼主今天就尝试着在一篇文章中讲述这三个问 阅读全文
posted @ 2018-05-19 21:01 莫那-鲁道 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 前言 今天我们继续学习并发。在之前我们学习了 JMM 的知识,知道了在并发编程中,为了保证线程的安全性,需要保证线程的原子性,可见性,有序性。其中,synchronized 高频出现,因为他既保证了原子性,也保证了可见性和有序性。为什么,因为 synchronized 是锁。通过锁,可以让原本并行的 阅读全文
posted @ 2018-05-19 21:01 莫那-鲁道 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 前言 在 Java 刚诞生时,Thread 类就已经有了很多方法,但这些方法由于一些原因(有一些明显的bug或者设计不合理)有些已经废弃了,但是他们的方法名却是非常的好,真的是浪费。我们在进行并发必编程的时候一定要注意这些。 1. 过期方法1 stop 方法 2. 过期方法2 suspend 方法和 阅读全文
posted @ 2018-05-19 21:00 莫那-鲁道 阅读(307) 评论(0) 推荐(1) 编辑
摘要: 前言 2018 元旦快乐。 摘要: 1. notify wait 如何使用? 2. 为什么必须在同步块中? 3. 使用 notify wait 实现一个简单的生产者消费者模型 4. 底层实现原理 1. notify wait 如何使用? 今天我们要学习或者说分析的是 Object 类中的 wait 阅读全文
posted @ 2018-05-19 20:52 莫那-鲁道 阅读(3688) 评论(0) 推荐(0) 编辑
摘要: 前言 在 Java 的并发编程中,有一个问题需要特别注意,那就是死锁,如果发生了死锁,基本就是重启,而重启将会丢失运行中的数据。所以,了解死锁的形成并排查死锁到预防死锁成了一个重要的问题。 我们了解任何一个事情的步骤是:what,how,why,why not。 1. 什么是死锁? 我们还是直接写一 阅读全文
posted @ 2018-05-19 20:50 莫那-鲁道 阅读(324) 评论(0) 推荐(0) 编辑
摘要: 前言 SOFARPC 提供了多种调用方式满足不同的场景。 例如,同步阻塞调用;异步 future 调用,Callback 回调调用,Oneway 调用。 每种调用模式都有对应的场景。类似于单进程中的调用模式。在单进程中,我们可以使用 JDK 的 Future 实现异步,可以通过观察者实现回调。 那么 阅读全文
posted @ 2018-05-09 21:41 莫那-鲁道 阅读(605) 评论(0) 推荐(0) 编辑
摘要: 前言 通常 RPC 调用需要客户端使用服务端提供的接口,而具体的形式则是使用 jar 包,通过引用 jar 包获取接口的的具体信息,例如接口名称,方法名称,参数类型,返回值类型。 但也存在一些情况,例如客户端没有 jar 包,或者是跨语言的调用,这个时候,就需要客户端使用字符串进行泛化调用。 如何使 阅读全文
posted @ 2018-05-08 12:58 莫那-鲁道 阅读(1093) 评论(0) 推荐(0) 编辑
摘要: 前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的。 那么,如何实现这样一个 RPC 框架的网络连接呢? 我们从 SOFA 中寻找答案。 连接管理器介绍 先从一个小 demo 开始看: 上面的代码 阅读全文
posted @ 2018-05-08 02:03 莫那-鲁道 阅读(306) 评论(0) 推荐(0) 编辑