随笔分类 - 多线程编程
线程安全、高并发
摘要:1. 简介 JUC中的CyclicBarrier提供了一种多线程间的同步机制,可以让多个线程在barrier等待其它线程到达barrier。正如其名CyclicBarrier含义就是可以循环使用的屏障。 2. 源码解读 2.1 数据结构 2.1.1 Generation 在CyclicBarrier
阅读全文
摘要:1.简介 ConcurrentLinkedQueue是JUC中的基于链表的无锁队列实现。本文将解读其源码实现。 2. 论文 ConcurrentLinkedQueue的实现是以Maged M. Michael和Michael L. Scott的论文 "Simple, Fast, and Practi
阅读全文
摘要:简介 Treiber Stack在 R. Kent Treiber在1986年的论文 "Systems Programming: Coping with Parallelism" 中首次出现。它是一种无锁并发栈,其无锁的特性是基于CAS原子操作实现的。 实现 下面给出的Java语言实现为《Java并
阅读全文
摘要:1. 背景 之前读JUC的AQS源码,读到Condition部分,我当时也写了一篇源码阅读文章 (AbstractQueuedSynchronizer源码解读 续篇之Condition)[http://www.cnblogs.com/micrari/p/7219751.html]。Doug Lea大
阅读全文
摘要:1. 背景 在之前的博文 "ThreadPoolExecutor源码解读" 已经对ThreadPoolExecutor的实现原理与源码进行了分析。ScheduledExecutorService也是我们在开发中经常会用到的一种ExecutorService,JDK中它的默认实现类为Scheduled
阅读全文
摘要:背景 最近在项目中看到太多后台task中使用Executor框架,提交任务后,把future都一个个加入到list,再一个个get这些future的代码。 这个的问题在于一方面没有时限,可能会被某些运行缓慢的future拖很久。即便使用带超时控制的get方法,这样加入list再get的做法依然很繁琐
阅读全文
摘要:1. 背景与简介 在Java中异步任务的处理,我们通常会使用Executor框架,而ThreadPoolExecutor是JUC为我们提供的线程池实现。 线程池的优点在于规避线程的频繁创建,对线程资源统一管理,在任务到达时能快速响应。 本文从JUC的ThreadPoolExecutor源码出发来剖析
阅读全文
摘要:1. 背景与简介 Future是Java执行异步任务时的常用接口。我们通常会往ExecutorService中提交一个Callable/Runnable并得到一个Future对象,Future对象表示异步计算的结果,支持获取结果,取消计算等操作。在Java提供的Executor框架中,Future的
阅读全文
摘要:1. 背景 最近团队内部技术分享,我做了个关于AQS的分享。ppt中涵盖的部分要点内容,现在整理到博客上。 关于AQS本身的源码解读,可以参考 "我之前的博文" 。 2. 要点梳理 下面是一些技术分享的要点梳理。 2.1 LockSupport的实现 AQS中的阻塞/唤醒最终是基于LockSuppo
阅读全文
摘要:1. 背景 在之前的 "AbstractQueuedSynchronizer源码解读" 中,介绍了AQS的基本概念、互斥锁、共享锁、AQS对同步队列状态流转管理、线程阻塞与唤醒等内容。其中并不涉及Condition相关的内容。本文主要介绍AQS中Condition的实现即ConditionObjec
阅读全文
摘要:1. 背景 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是Doug Lea大师创作的用来构建锁或者其他同步组件(信号量、事件等)的基础框架类。JDK中许多并发工具类的内部实现都依赖于AQS,如ReentrantLock, Sem
阅读全文
摘要:背景 在应用程序中,时常会碰到需要维护一个map,从中读取一些数据避免重复计算,如果还没有值则计算一下塞到map里的的小需求(没错,其实就是简易的缓存或者说实现记忆化)。在公司项目里看到过有些代码中写了这样简易的缓存,但又忽视了线程安全、重复计算等问题。本文主要就是谈谈这个小需求的实现。 实现 Ha
阅读全文
摘要:1. 背景 ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。 ThreadLocal非常适合对Java多线程编程感兴趣的程序员作为入门类阅读,原因
阅读全文
摘要:背景 最近在啃《多处理器编程的艺术》,书中的7.6节介绍了时限锁——实现了tryLock方法的队列锁。 书中重点讲解了tryLock的实现,也就是如何实现在等待超时后退出队列,放弃锁请求,并且能让后继线程感知到。 在实现的过程中,我为TOLock补充了lock方法的实现。代码如下所示: public
阅读全文
摘要:记录一个遇到的隐蔽的空指针异常。 公司里的测试同事之前发现项目里有处偶现的空指针异常。 大致的代码是这样的: 对于固定的测试集,多次重跑偶现空指针出现在groupingBy中,乍一看推断是item.getInvestor()为null导致getName()出现空指针。但经过debug查看,实际上是偶
阅读全文
摘要:关于ThreadPoolExecutor的源码解读,请参考我的最新博客《ThreadPoolExecutor源码解读》。 Java中的线程即是工作单元也是执行机制,从JDK 5后,工作单元与执行机制被分离。工作单元包括Runnable和Callable,执行机制由JDK 5中增加的java.util
阅读全文
摘要:volatile通常被认为是一种轻量级的synchronized,字面上它表示易变的,在并发编程中,它保证了共享变量的可见性。所谓可见性指的是,某个线程对变量进行操作后,其他线程能够读取到操作后的最新结果。 CPU通常不会直接与内存通信,内存中的数据首先会被读取到缓存中进行读写。当对声明了volat
阅读全文

浙公网安备 33010602011771号