参考资料:
JAVA并发专题 - 终有救赎的专栏 - 掘金
Java并发编程学习路线(建议收藏��) | Java程序员进阶之路x沉默王二
面试题目:
JUC第一讲:Java并发知识体系详解 + 面试题汇总(P6熟练 P7精通)-阿里云开发者社区
-
练气篇 内存模型
第一章 CPU多级缓存模型
1.什么是CPU多级缓存模型?小陈:老王,最近学习并发不知如何入手,看的知识很零散;没多久又记不住了,你有啥好建议吗? - 掘金
-
第二章 CPU 缓存一致性MESI
4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?MESI一致性协议 小陈:老王,上一章你让我看看MESI一致 - 掘金
-
第三章 JMM模型
2.什么是JAVA内存模型?为什么要设计JAVA内存模型? 小陈:老王,看了上一篇的《CPU多级缓存模型》,有个疑问为什 - 掘金
第四章 JMM一致性的实现
1.内存可见性
2.禁止指令重排序
6.什么是内存屏障?具有什么作用?什么是内存屏障? 小陈:老王,上一篇你引出了volatile底层是通过内存屏障来解决可 - 掘金
-
筑基篇 volatile、synchronized
第五章 内存可见性、指令重排、原子性
内存可见性
- 指令重排
- 原子性
3.线程安全之可见性、有序性、原子性是什么?小陈:上一篇说了JAVA内存模型,但是后面说了在多线程并发操作的时候有可见性 - 掘金
第六章 Volatile的三性实现
- 内存可见性
2.指令重排
7.volatile怎么通过内存屏障保证可见性和有序性?volatile通过内存屏障保证可见性 小陈:老王,你上一篇抛出 - 掘金
第七章 Synchronized的基本用法
1.锁加在静态对象上
2.锁加在实例对象上
3.锁在同一实例对象上才互斥,monitorenter申请锁,nonitorexit释放锁。
9.synchronized 是个啥东西?应该怎么使用?synchronized 是什么? 老王:小陈,从今天开始我们就 - 掘金
第八章 Synchronized的底层实现
- 对象头
2.Mark word
10.对象头、Mark Word、monitor、synchronized怎么关联起来?老王:开讲啦,开讲啦,小陈快来上 - 掘金
3.锁的升级
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁小陈:呼叫老王.... - 掘金
第九章 Synchronized的三性实现
1.内存可见性
2.指令重排
3.原子性实现
13.synchronized总结:怎么保证可见性、有序性、原子性?synchronized的原子性 通过前面的篇章我们 - 掘金
结丹篇 CAS
第十章 Unsafe类基本操作
- 分配和回收对外内存
- 直接访问内存地址上的数据
- CAS操作
- 挂起和唤醒线程
- 读障碍器、写障碍器、全障碍器
14.JDK底层Unsafe类是个啥东西?老王:小陈啊,从今天开始我们就要进入 《结丹篇》 了,在这一篇章里面,要注意听 - 掘金
第十一章 CAS的原子性
- 加偏向锁或者轻量级锁
- 通知总线独占
15.unsafe类的CAS是怎么保证原子性的?老王:小陈啊,上一章我们讲了usafe是个啥东西,以及unsafe提供的 - 掘金
第十二章 AtomicBoolean、AtomicInteger、AtomicLong
- volatile & CAS
- 适用于并发较轻的情况
17.AtomicInteger、AtomicBoolean的底层原理小陈:老王啊,今天就要开始Atomic原子类的学习 - 掘金
第十三章 LongAdder
1.当并发较重的情况下,while循环自旋会很浪费时间。
2.使用分段锁方式来提高并发。
19.Atomic系列之LongAdder的底层原理(分段锁提升并发性能)老王:小陈啊,上一章我们讲解了cas的缺陷,无 - 掘金
第十四章 AtomicReference、AtomicStampedReference
- AtomicReference解决同时需要更新多个变量的问题
- AtomicStampedReference解决ABA问题
18.AtomicReference、AtomicStampReference底层原理。多个变量更新怎么保证原子性?CAS的ABA问题怎么解决? - 掘金
-
元婴篇 并发锁与框架
第十五章 AQS基础框架
AbstractQueueSynchronizer
tryLock()
tryRelease()
getState()
setState()
Enq()
addWaiter()
Park
Unpark()
Java高级面试必问:AQS 到底是什么? - 知乎
第十六章 ReentrantLock
深入理解Java并发重入锁ReentrantLock | 二哥的Java进阶之路
Volatile +CAS 实现线程互斥访问
关键字 | 使用方式 | 公平性 | 排队队列 | 性能比较 | 实现方式 |
lock | 显示加锁和释放锁 | 非公平锁、公平锁 | 可在多个condition队列上等待 | 大部分情况下比synchronized优 | Volatile+CAS |
synchronized | 使用关键字修饰方法、方法块 | 非公平锁 | 只能在单个队列上等待 | 在JDK1.6 JVM对synchronized关键字优化后,性能基本接近 | Monitor |
第十七章 ReadWriteLock
深入理解Java并发读写锁ReentrantReadWriteLock | 二哥的Java进阶之路
Int state,高位表示读锁数量,低位表示写锁数量。
读锁:持有读锁时,其他线程可继续获取读锁,不可获取写锁。
写锁:持有写锁时,其他线程不可获取读锁,也不可获取写锁。
锁降级
锁降级:是指在获取写锁后,再获取读锁,然后释放写锁,释放读锁。
解决问题:解决某线程写入数据后,接着读取该数据,可能不一致的问题。
第十八章 线程间的通信
Object
wait(), notify(), notifyAll()
使用案例:生产者与消费者1,不能精确通知条件
从根上理解生产者-消费者模式 | 二哥的Java进阶之路
Condition
await(), signal(), signalAll()
使用案例:生产者与消费者2,可精确通知条件里的一个线程
详解 Java Condition 的 await 和 signal 等待通知机制 | 二哥的Java进阶之路
LockSupport
park(), unpark(Thread t)
使用案例:ABC打印问题,可精准通知线程
深入理解Java并发线程阻塞唤醒类LockSupport | 二哥的Java进阶之路
第十九章 框架通信类
Semphore
Exchanger
CountDownLatch
CyclicBarrier
Java并发编程通信工具类 Semaphore、Exchanger、CountDownLatch、CyclicBarrier、Phaser等一网打尽 | 二哥的Java进阶之路
- 化神篇 并发容器
基础容器
第二十章 CopyOnWriteArrayList
底层实现:写的时候拷贝数据到新数组,然后设置到新的数组引用。
使用场景:读多写少。
CopyOnWriteArrayList实现原理及源码分析-腾讯云开发者社区-腾讯云
第二十一章 ConcurrentLinkedList
底层实现:lock
吊打面试官之Java ConcurrentLinkedQueue | 二哥的Java进阶之路
第二十二章 ConcurrentHashMap
底层实现:1.7 segement 分段锁 1.8 CAS+synchronized
吊打Java面试官之ConcurrentHashMap(线程安全的哈希表) | 二哥的Java进阶之路
BlockingQueue
第二十三章 ArrayBlockingQueue
一把锁,两个等待队列。
第二十四章 LinkedBlockingQueue
两把锁,两个等待队列。
源码深入解析BlockingQueue | 二哥的Java进阶之路
第二十五章 PriorityBlockingQueue
小顶堆取优先级最小的出队列。
PriorityBlockingQueue详解 - 忧愁的chafry - 博客园
第二十六章 SynchronousQueue
作用:放入的线程全部等待消费线程来取(可同时多个线程),事件的及时传递。
底层:非公平通过Stack来实现,公平通过队列来实现。
源码解析Synchronous Queue 这种特立独行的队列 - 知乎
特殊容器
第二十七章 ThreadLocal
一个线程的threadLocalMap可以有多个threadLocal做weak reference key,来保持不同的对象。
ThreadLocal
set(Object value)
Get()
Remove() 不使用的时候记得显式清除。
5000字10张图讲清楚本地变量ThreadLocal | 二哥的Java进阶之路
- 飞升篇 线程池
第二十八章 ThreadPoolExecutor
- 小于coreThread,新建线程;
- 大于coreThread, 放入等待队列;
- 小于maxThread,新建线程;
- 大于maxThread,启用拒绝策略。
newFixed coreThread ==maxThread, LinkedBlockingQueue 队列无界容易内存溢出
newCached coreThread,Integer.MAX_VALUE, SynchronousQueue 队列无界,效率不高
24张图带你彻底弄懂 Java 线程池 | 二哥的Java进阶之路
第二十九章 ScheduledThreadPoolExecutor
fixedRate 每五分钟一次
fixedDelay 每隔五分一次
深入剖析Java定时任务ScheduledThreadPoolExecutor | 二哥的Java进阶之路
第三十章 ForkJoinPool
ForkJoinPool
深入理解Java并发编程之Fork/Join框架 | 二哥的Java进阶之路