![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
Bolon0708
昨日已成过往,明日未来可期。
展开
-
面试官:听说你看过ThreadLocal源码?我来瞅瞅?
全文共10000+字,31张图,这篇文章同样耗费了不少的时间和精力才创作完成,请大家点点关注+在看,感谢。对于ThreadLocal,大家的第一反应可能是很简单呀,线程的变量副本,每个线程隔离。那这里有几个问题大家可以思考一下: ThreadLocal的key是弱引用,那么在 threadLocal.get()的时候,发生GC之后,key是否为null? ThreadLocal中ThreadLocalMap的数据结构? ThreadLocalMap的Hash算法? ...转载 2020-05-14 16:06:15 · 1166 阅读 · 2 评论 -
面试官没想到,一个Volatile都能吹半小时
Volatile可能是面试里面必问的一个话题吧,对他的认知很多朋友也仅限于会用阶段,今天我们换个角度去看看。先来跟着丙丙来看一段demo的代码:你会发现,永远都不会输出有点东西这一段代码,按道理线程改了flag变量,主线程也能访问到的呀?为会出现这个情况呢?那我们就需要聊一下另外一个东西了。JMM(JavaMemoryModel)JMM:Java内存模型,是java虚拟机规...转载 2020-04-29 13:49:46 · 669 阅读 · 1 评论 -
【并发编程】MESI--CPU缓存一致性协议
目录概念#MESI协议中的状态#MESI状态转换图#操作#概念#MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议。MESI协议中的状态#CPU中每个缓存行(caceh line)使用4种状态进行标记(使用额外的两位(bit)表示)...转载 2020-04-29 11:11:22 · 241 阅读 · 0 评论 -
为什么阿里巴巴要禁用Executors创建线程池?
目录写在前面线程池的定义Executors创建线程池的方式ThreadPoolExecutor对象线程池执行任务逻辑和线程池参数的关系Executors创建返回ThreadPoolExecutor对象OOM异常测试如何定义线程池参数看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式...转载 2019-12-10 15:24:27 · 326 阅读 · 0 评论 -
java AQS的实现原理(大部分同步类都依赖AQS实现)
目录1. ReentrantLock的调用过程2. 锁实现(加锁)2.1 Sync.nonfairTryAcquire2.2 AbstractQueuedSynchronizer.addWaiter2.3 AbstractQueuedSynchronizer.acquireQueued3. 解锁4. Lock VS Synchronized谈到并发,不得不谈Reen...转载 2019-07-31 15:36:17 · 227 阅读 · 0 评论 -
LockSupport原理分析
目录一. LockSupport类介绍二. LockSupport类示例三. LockSupport源码注释一. LockSupport类介绍LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程。主要是通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作的。每个线程都有一个许可(permit),permit只有两个值1和0,默认是0。...转载 2019-07-30 19:17:45 · 213 阅读 · 1 评论 -
ConcurrentHashMap源码分析(1.8)
目录0、说明1、ConcurrentHashMap跟HashMap,HashTable的对比2、ConcurrentHashMap原理概览3、ConcurrentHashMap几个重要概念4、ConcurrentHashMap几个重要方法5、ConcurrentHashMap的初始化6、ConcurrentHashMap的put操作详解7、ConcurrentHas...转载 2019-08-02 16:09:15 · 301 阅读 · 0 评论 -
为什么ConcurrentHashMap的读操作不需要加锁?
我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇博文讨论的问题——为什么它不需要加锁呢?ConcurrentHashMap的简介我想有基础的同学知道在jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的,而1.8中放弃了Se...转载 2019-08-02 15:26:37 · 382 阅读 · 0 评论 -
Java并发工具类详解:CountDownLatch、CyclicBarrier、Semaphore和Exchanger
目录一.CountDownLatch(等待多线程完成)用法二.CyclicBarrier(同步屏障)用法三.Semaphore(控制并发线程数)用法四.Exchanger(线程间交换数据)在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exch...转载 2019-07-29 20:27:18 · 723 阅读 · 1 评论 -
并发编程之 Fork-Join 分而治之框架
目录前言Fork & Join 的具体含义前言“分而治之” 一直是一个有效的处理大量数据的方法。著名的 MapReduce 也是采取了分而治之的思想。简单来说,就是如果你要处理1000个数据,但是你并不具备处理1000个数据的能力,那么你可以只处理其中的10个,然后,分阶段处理100次,将100次的结果进行合成,那就是最终想要的对原始的1000个数据的处理结果。Fork...转载 2019-07-29 19:44:06 · 133 阅读 · 0 评论 -
深入理解Java中的volatile关键字
目录volatile的用法volatile的原理volatile与可见性内存屏障volatile与有序性volatile与原子性总结与思考在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized、volatile、final...转载 2019-07-31 20:02:44 · 229 阅读 · 0 评论 -
基于ReentrantLock理解AQS同步队列的细节和设计模式
目录重入锁ReentrantlockLock接口公平锁和非公平锁总结Reentrantlock与AQS总结Node和AQS工作原理总结基于Reentrantlock分析AQS独占锁模式的实现非公平锁的获取锁获取锁加入同步队列自旋总结:1、A直接获取到锁:2、B尝试获取锁:3、C尝试获取锁:非公平锁的释放锁总结Re...转载 2019-08-01 10:49:45 · 1256 阅读 · 1 评论 -
JDK 提供的线程池及使用场景
目录JDK提供的四种线程池类型1.newFixedThreadPool2.newSingleThreadExecutor3.newCachedThreadPool4.newScheduledThreadPool两种提交任务的方法executesubmit如何合理地选择或者配置总结JDK 为我们内置了四种常见线程池的实现,均可以使用Executors工...转载 2019-08-05 16:05:48 · 431 阅读 · 0 评论 -
java自己动手写一个锁Lock
问题(1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁?简介本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁、解锁操作。本篇文章的目标二是通过自己动手写一个锁,能更好地理解后面章节将要学习的AQS及各种同步器实现的原理。分析自己动手写一个锁需要准备些什么呢?首先,在上一章学习synch...转载 2019-08-01 15:00:34 · 716 阅读 · 0 评论 -
Java并发编程- 从同步容器(Vector、HashTable)到并发容器(CopyOnWrite、ConcurrentHashMap、ConcurrentSkipListMap)
目录引言同步容器Vector和HashTable并发容器CopyOnWrite并发容器ConcurrentHashMap并发容器ConcurrentSkipListMap总结引言容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,我前面的文章中对Java集合包中的关键容器进行过一个系列的分析,但这些集合类都是非线程安全...转载 2019-08-01 19:33:54 · 494 阅读 · 0 评论 -
并发安全
目录1.类的线程安全定义2.怎么才能做到类的线程安全?2.1 栈封闭2.2 无状态2.3 让类不可变2.4 Volatile2.5 加锁和CAS2.6 安全的发布2.7 TheadLocal2.8 关于Servlet(生命周期;是否安全)3.线程不安全引发的问题3.1 死锁3.1.1 普通的死锁3.1.2 动态顺序死锁3.2 活锁3....转载 2019-08-06 09:49:32 · 238 阅读 · 0 评论 -
JMM和底层实现原理
目录1.并发编程领域的关键问题1.1 线程之间的通信1.2 线程间的同步2.Java内存模型——JMM2.1 现代计算机的内存模型2.2 Java内存模型(JMM)2.2.1 JVM对Java内存模型的实现2.3 Java内存模型带来的问题2.3.1 可见性问题2.3.2 竞争现象2.4 Java内存模型中的重排序2.4.1 重排序类型2.4.2...转载 2019-08-06 09:55:11 · 257 阅读 · 0 评论 -
阿里P8架构师谈:深入探讨HashMap的底层结构、原理、扩容机制
目录简介内部实现存储结构-字段功能实现-方法1. 确定哈希桶数组索引位置2. 分析HashMap的put方法3. 扩容机制线程安全性JDK1.8与JDK1.7的性能对比Hash较均匀的情况Hash极不均匀的情况小结HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit...转载 2019-08-02 13:13:50 · 401 阅读 · 0 评论 -
探索JAVA并发 - 线程池详解
目录Executor框架Executors与常用线程池线程池构造参数线程池创建示例有返回值的提交方式submitsubmit Callablesubmit实现原理关闭线程池扩展线程池总结线程池是并发编程中必不可少的一种工具,也是面试高频话题。线程池,即管理着若干线程的资源池(字面意思)。相比于为每个任务分配一个线程,在线程池中执行任务优势更...转载 2019-08-07 17:20:26 · 177 阅读 · 0 评论 -
线程间协作的两种方式:wait、notify、notifyAll和Condition
目录一.wait()、notify()和notifyAll()二.Condition三.生产者-消费者模型的实现在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费...转载 2019-07-29 19:13:33 · 418 阅读 · 0 评论 -
【线程】Java线程的启动和终止
目录线程启动线程终止线程启动在Java中我们启动线程都是调用Thread类中的start()方法来启动,当线程处理完run()方法里面的逻辑后自动终止。但是在调用start()方法之前,我们需要先构建一个Thread对象,一般我们都是直接使用Thread类的构造函数来创建一个线程对象,Thread构造函数定义如下:public Thread() { init(null...转载 2019-07-29 15:42:08 · 615 阅读 · 0 评论 -
面试必备之乐观锁与悲观锁
目录何谓悲观锁与乐观锁悲观锁乐观锁两种锁的使用场景乐观锁常见的两种实现方式1. 版本号机制2. CAS算法乐观锁的缺点1 ABA 问题2 循环时间长开销大3 只能保证一个共享变量的原子操作CAS与synchronized的使用情景何谓悲观锁与乐观锁乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏...转载 2018-07-03 18:58:32 · 1270 阅读 · 0 评论 -
ConcurrentHashMap源码分析
目录1. ConcurrentHashMap有哪些成员变量?2. 分段锁的内部结构是怎样的?3. ConcurrentHashMap初始化时做了些什么?4. 通过怎样的方式来定位锁和定位元素?5. 查找元素具体是怎样实现的?6. 插入元素具体是怎样实现的?7. 删除元素具体是怎样实现的?8. 替换元素具体是怎样实现的?9. 自旋时具体做了些什么?10. 哈希...转载 2019-04-25 20:02:03 · 123 阅读 · 0 评论 -
JUC 中的 Atomic 原子类总结
目录1. 介绍一下Atomic 原子类2. JUC 包中的原子类是哪4类?2 基本类型原子类2.1 基本类型原子类介绍2.2 AtomicInteger 常见方法使用2.3 基本数据类型原子类的优势2.4 AtomicInteger 线程安全原理简单分析3 数组类型原子类3.1 数组类型原子类介绍3.2 AtomicIntegerArray 常见方法使用...转载 2019-04-01 20:00:54 · 746 阅读 · 0 评论 -
线程池ThreadPool
目录1. 为什么要用线程池?2. 实现Runnable接口和Callable接口的区别3. 执行execute()方法和submit()方法的区别是什么呢?4. 如何创建线程池1. 为什么要用线程池?线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java并发编程的艺术》提到的来说一下使用线程池...转载 2019-04-01 19:52:12 · 211 阅读 · 0 评论 -
Synchronized关键字使用、底层原理、底层优化、ReenTrantLock的对比
目录1.1 说一说自己对于 synchronized 关键字的了解1.2 说说自己是怎么使用 synchronized 关键字,在项目中用到了吗1.3 讲一下 synchronized 关键字的底层原理1.4 说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗1.5 谈谈 synchronized和ReenTrantLock ...转载 2019-03-27 15:57:52 · 1478 阅读 · 0 评论 -
Java中的锁原理、锁优化、CAS、AQS详解!
目录一、为什么要用锁?二、锁实现的基本原理2.1、volatile2.2、synchronized2.2.1 synchronized实现原理2.2.2 synchronized具体实现2.2.3 锁存放的位置2.2.3 synchronized的锁优化2.2.4 锁的优缺点对比2.3、CAS三、Java中的锁实现3.1、队列同步器(AQS)3....转载 2019-04-10 10:28:53 · 405 阅读 · 0 评论 -
Synchronized 有几种用法?
目录1、同步普通方法2、同步静态方法3、同步类4、同步this实例5、同步对象实例我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面。其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法。1、同步普通方法这个也是我们用得最多的,只要涉及线程安全,上来就给方法来个同步锁。这种方法使用虽然最简单,但是只能作...转载 2019-04-10 10:20:23 · 179 阅读 · 0 评论 -
面试官必问的8道volatile关键字命题,你答对了吗?
在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性都牵扯出来,深入地话还可以考察JVM底层实现以及操作系统的相关知识。目录一、面试官: Java并发这块了解的怎么样?说说你对volatile关键字的理解二、面试官: 能不能详细说下什么...转载 2019-03-19 13:53:12 · 2474 阅读 · 1 评论 -
Java线程池原理分析与使用(尤其当线程队列满了之后事项)
在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面我们主要针对线程池来一步一步揭开线程池的面纱。使用线程池的好处:1、降低资源消耗可以重复利用已创建的线程降低线程创建和销毁造成的消耗。2、提高响应速度当任务到达时,任务可以不需要等到线程创建就能立即执行。3、提高线程的可管理性线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的...转载 2019-03-18 13:20:38 · 14769 阅读 · 1 评论 -
线程本地变量ThreadLocal
目录ThreadLocal理解:ThreadLocal解决的问题:ThreadLocal的使用场景:ThreadLocal主要方法:ThreadLocal源码分析:get方法:getMap(t)方法:setInitialValue()方法和initialValue()方法:createMap(t, value):set(T value)方法:Thre...转载 2019-04-22 11:01:25 · 752 阅读 · 0 评论 -
线程本地ThreadLocal的介绍与使用以及与synchronized的对比
ThreadLocal简介我们通过上两篇的学习,我们已经知道了变量值的共享可以使用public static变量的形式,所有的线程都使用同一个被public static修饰的变量。那么如果我们想实现每一个线程都有自己的共享变量该如何解决哪?JDK提供的ThreadLocal正是为了解决这样的问题的。类ThreadLocal主要解决的就是每个线程绑定自己的值,可以将ThreadLoc...转载 2019-04-22 11:19:09 · 143 阅读 · 0 评论 -
JAVA中CAS简介、原理剖析、问题及解决方案和原子操作类Atomic
目录无锁的概念无锁的执行者-CASCPU指令对CAS的支持鲜为人知的指针: Unsafe类Unsafe里的CAS 操作相关挂起与恢复并发包中的原子操作类(Atomic系列)原子更新基本类型CAS的ABA问题及其解决方案AtomicStampedReference类AtomicMarkableReference类再谈自旋锁本篇的思路是先阐明无锁执...转载 2019-03-15 14:22:44 · 755 阅读 · 0 评论 -
Java并发编程:Callable、Future和FutureTask
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务...转载 2019-07-04 13:06:43 · 86 阅读 · 0 评论 -
高并发的核心技术-幂等的实现方案
目录一、背景二、幂等性概念三、技术方案一、背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如:1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。 2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱; 3. 发送消息,也应该只发一次,同样的短信发给...转载 2019-07-08 11:32:14 · 126 阅读 · 0 评论 -
Java多线程详解
目录多线程基础一、创建线程和启动(1)继承Thread类创建线程类(2)实现Runnable接口创建线程类(3)通过Callable和Future创建线程二、线程的生命周期1、新建状态2、就绪状态3、运行状态4、阻塞状态5、死亡状态三、线程管理1、线程睡眠——sleep2、线程让步——yield3、线程合并——join4、设置线程的优...转载 2019-07-02 16:28:07 · 554 阅读 · 0 评论 -
Java并发阻塞队列--BlockingQueue
目录一、什么是BlockingQueue二、BlockingQueue的用法三、BlockingQueue接口中的方法四、BlockingQueue的实现类4.1 ArrayBlockingQueue4.2 DelayQueue4.3 LinkedBlockingQueue4.4 PriorityBlockingQueue4.5 SynchronousQue...转载 2019-04-30 15:26:50 · 440 阅读 · 0 评论 -
Java多线程--让主线程等待子线程执行完毕(CountDownLatch类)
java.util.concurrent.CountDownLatch使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待。CountDownLatch是一个同步辅助工具,用于使一个或多个线程等待(即阻塞)知道一组在其他线程中的任务结束。 CountDownLatch必须用给定的count(一个int类型的大于等于0...转载 2019-04-30 10:50:22 · 4163 阅读 · 0 评论 -
Java并发编程中的若干核心技术,向高手进阶!
引言本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在Java中做并发编程实践的时候应该注意什么,应该关注什么,如何保证线程安全,以及如何选择合适的工具来满足需求。当然,更深层次的内容就会涉及到JVM层面的知识,包括底层对Java内存的管理,对线程的管理等较为核心的问题,当然,本文的定位在于抽象与总结,更为具体而深入的内容就需要...转载 2019-04-17 20:03:56 · 157 阅读 · 0 评论 -
教你如何监控 Java 线程池运行状态
之前写过一篇 Java 线程池的使用介绍文章《线程池全面解析》,全面介绍了什么是线程池、线程池核心类、线程池工作流程、线程池分类、拒绝策略、及如何提交与关闭线程池等。但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等。如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的...转载 2019-04-17 19:59:21 · 4347 阅读 · 0 评论