随笔分类 - 高并发 / JAVA并发编程
摘要:背景 之前某需求在触发流控时需要中断ExcutorService中的子线程,发现无论Shutdown、ShutdownNow方法都无法直接停止子线程,今天看到线程的interrupt()方法才了解如何停止。 stop() 和 interrupt() stop方法 stop() 方法会真的杀死线程,不
阅读全文
摘要:Java 语言在 1.5 之前,提供的唯一的并发原语就是管程,而且 1.5 之后提供的 SDK 并发包,也是以管程技术为基础的。 管程:管理共享变量以及对共享变量的操作过程,让它们支持并发。 MESA 模型 先后出现过三种不同的管程模型,分别是:Hasen 模型、Hoare 模型和 MESA 模型。
阅读全文
摘要:安全性 并发bug三大源头 源头 原子性问题 可见性问题 有序性问题 bug风险点 存在共享数据并且该数据会发生变化(即多个线程会同时读写同一数据) 分类 数据竞争 当多个线程同时访问同一数据,并且至少有一个线程会写这个数据。 假设 count=0,当两个线程同时执行 get() 方法时,get()
阅读全文
摘要:原子性 原子性:一个或多个操作在CPU执行的过程中不被中断的特性 原子性问题源头是线程切换,保证对共享变量的修改时互斥的,就可以保障原子性。 简易锁模型 临界区:一段需要互斥执行的代码 改进锁模型 明确锁的范围,能够锁住的资源。 简易锁模型容易出问题的地方: 1、锁住了错误的资源 2、锁的粒度太大,
阅读全文
摘要:Java内存模型 并发场景下,可见性/原子性/有序性是并发编程Bug源头,而Java内存模型解决了可见性和有序性问题。 Java内存模型定义 可见性问题原因是缓存,有序性问题原因是编译优化。为了兼顾程序性能和功能正常,按需禁用缓存以及编译优化。而按需,则是按照开发者代码完成。 Java 内存模型是个
阅读全文
摘要:目录背景核心矛盾解决思路异常根源cpu缓存导致的可见性问题线程切换带来的原子性问题编译优化带来的有序性问题 背景 核心矛盾 CPU/内存/IO设备的速度差异 解决思路 计算机体系结构——CPU 增加了缓存,以均衡与内存的速度差异 操作系统——操作系统增加了进程、线程,以分时复用 CPU,进而均衡 C
阅读全文