导图社区 Java工程面试-JUC脑图
java虚拟机提供的轻量级同步机制、只能保证一个共享变量的原子操作、引出ABA问题、一个数减到0,不可复用、一个数加到某个数,不可复用。
记录了尚硅谷java面试相关的基础知识、日常工作中一般用自己实现的线程池,不用Executors创建,参考阿里巴巴java开发手册并发这一张。垃圾收集器相关参数说明。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
Java工程面试
JUC多线程高并发
volatile
java虚拟机提供的轻量级同步机制
保证可见性
不保证原子性
禁止指令重排序
JMM
可见性
 
原子性
有序性
指令重排概念

指令重排小结
线程安全性获得保证
应用场景
单例模式DCL代码
  
单例模式volatile分析
CAS
原理
依赖于UnSafe类
unsafe.getAndAddInt
 多线程情况下执行: 
小结
缺点
循环时间长,开销大
只能保证一个共享变量的原子操作
引出ABA问题
本质: 狸猫换太子
当线程A进来把内存的值从V1改成V2以后,一段时间线程B进来把V2有改回了V1, 过段时间线程A又进来发现值还是原来的V1,认为挂载的这段时间这个内存地址的值没有发生过改变。 
解决ABA
原子引用
时间戳原子引用
为每次值得修改加一个时间戳,就可以解决原子引用问题: AtomicStampedReference
CountDownLatch
是什么
设置线程等待数,每当线程完成就减去一个数,做减法 
一个数减到0,不可复用
CyclicBarrierDemo
设置好等待数,每个线程完成任务,先用await方法自我阻塞,计数加一, 当最后所有线程完成了,计数加到等待数以后,就执行设置好的后续任务, 做加法
一个数加到某个数,不可复用
SemphoreDemo
加减结合,可以复用
阻塞队列理论
概念
Collection->Queue->BlockingQueue  
有什么好处
BlockingQueue的种类和分析
ArrayBlockingQueue
由数组结构组成的有界阻塞队列
LinkedBlockingQueue
由链表结构组成的有界阻塞队列(大小默认为Integer.MAX_VALUE)
PriorityBlockingQueue
支持优先级排序的误解阻塞队列
DelayQueue
使用优先级队列实现的延迟无界阻塞队列
SynchronousQueue
不存储元素的阻塞队列, 也即单个元素的队列 
LinkedTransferQueue
由链表结构组成的无界阻塞队列
LinkedBlockingDeque
由链表结构组成的双向阻塞队列
用在哪里
1. 生产者消费者模式 1.1 传统版 lock + condition 1.2 阻塞队列版 2. 线程池 3. 消息中间件
死锁编码和定位分析
产生死锁的主要原因
1.系统资源不足 2.进程运行推进顺序不正确 3.资源分配不当
解决方案
* jps java虚拟机的进程查看命令 * jps -l 列出当前所有的java启动进程 * jstack id 打印出对应id进程的虚拟机栈 通过这两步定位死锁