Java 并发
2022-10-19 21:30:15 1 举报
Java 并发
作者其他创作
大纲/内容
线程基础
什么是进程,什么是线程?
僵尸进程/孤儿进程是什么?
僵尸进程
孤儿线程
线程和进程有什么区别?
什么是线程
什么是进程
一个进程最多能有几个线程
进程与线程区别 JVM角度
为什么要使用多线程呢?
线程上下文切换
守护线程
程序执行的过程,简单说一下
线程的切换过程,了解吗?
线程实现
在用户空间实现线程
优势
劣势
在内核空间实现
优劣势
混合实现
内核线程的一些系统调用函数
线程的状态流转?
线程阻塞的三种情况
线程死亡的三种方式
状态流转
线程死锁?
如何预防避免线程死锁?
预防
避免
如何检测死锁/发现死锁
死锁必须具备以下四个条件?
API
创建线程的三种方式的对比?
Runnable VS Callable
Callable是怎么拿到返回结果的
如何创建线程实例并运行?
sleep()方法和wait()方法区别和共同点?
yield()
为什么我们调用start(0方法时会执行run()方法,为什么我们不能直接调用run()方法
ThreadLocal
ThreadLocal是什么?
知道ThreadLocal内存泄露问题吗?
ThreadLocall的实现原理
如果不remove,出问题了怎么补救?
Java 和 go 中,用户级别的线程和操作系统级别的线程对应关系是怎样的
Java---一个操作系统线程对应一个用户线程,考虑到线程切换对应的资源损耗,Java中不能创建特别多的线程,否则资源会话费在线程切换上
Go-----一个操作系统线程可以对应多个用户线程
Volatile
可见性
指令重排
应用场景
Cache line 缓存行对齐/伪共享
Java对应的 @Contented 注解,作用就是缓存行填充
cpu 三级缓存
缓存行
缓存对齐
伪共享
缓存行的四种状态
Synchronized
使用场景
作用用法
构造方法可以使用 synchronized 关键字修饰么?
底层实现原理
底层monitor对象的原理
比较
synchronized和ReentrantLock区别是什么?
synchronized 和 Lock 有什么区别?
synchronized和volatile的区别是什么?
锁优化
为什么锁升级
锁升级优化
偏向锁
为什么要有?
偏向锁原理和升级过程
过程
分支主题
轻量级锁
轻量级锁原理和升级过程
自旋锁与重量级锁
上锁、锁升级的过程
1. 对象刚new出来
默认会上轻量级锁,因为偏向锁有个时延,默认是4秒
JDK 默认对象头是无锁的,JDK11 打开就是偏向锁
2. 如果有线程上锁,偏向锁
如果有线程第一次上锁,会上偏向锁
偏向锁的过程,就是将自己线程的 id 值写到对象头 markword 上
不需要竞争,这把锁就是偏向第一个线程的
下一次同一个线程上锁的时候,不需要竞争,只要看到对象头的线程id是自己的,就可以使用
当线程销毁时,偏向锁降级为无锁。
偏向锁的意义
类似Vector、HashTable、StringBuffer 这些类,方法上都写了sync,需要加锁
但很多情况下都没有其他的线程来竞争,都是单线程在运行他们
因此每当线程来的时候就竞争,效率太低,这就是偏向锁存在的意义
3. 如果有线程竞争锁,轻量级锁
如果有线程来竞争锁,会撤销偏向锁,升级为轻量级锁
线程在自己的线程生产 lockRecord,基于CAS,尝试将 markword 设置位指向自己线程的 LR 指针。设置成功的,得到锁。设置失败的,原地自旋
如果竞争加剧,升级为重量级锁
自旋超过10次
自旋线程数量达到CPU 核数的一半
4. 如果有大量线程竞争锁,重量级锁
重量级锁和轻量级锁的区别
编译器优化
自旋锁与自适应自旋锁
锁粗化
锁消除
锁膨胀
sync 层级实现
首先是 Java 代码里加了 sync 锁
在字节码中,会使用 moniterentry , mointerexit, 描述加锁范围
Jvm 执行过程中,自动进行锁升级的过程
对应的cpu指令, lock comxchg
CAS
CAS是什么?
处理器如何实现原子操作
CAS有什么缺陷?
无锁只有cas一种实现吗 ,有其他实现方式吗
CAS 修改值,原子性如何保证?/ CAS 的原理
CAS 是一个native方法,是C++实现的
在C++中,调用了Atomic 类的 cmpxchg 方法
最终转换为 cpu指令,lock cmpxchg。cmpxchg 本身没有原子性,原子性体现在lock,意思是锁总线,保证多核情况下对共享资源的独占访问。
JMM
并发编程的三特性
Happens-Before
JMM
原子类
Atomic类的原理是什么呢
介绍一下Atomiclnteger类的原理?
JUC包中的原子类是哪4类?
使用原子的方式更新基本类型
数组类型|使用原子的方式更新数组里的某个元素
引用类型|
对象的属性修改类型
ConcurrentHashMap
1.7 分段锁
Put操作
size 方法
1.8
和1.7的比较
Put操作
Get操作
resize()
get方法不需要加锁与volatile修饰的哈希桶有关吗?
ConcurrentHashMap 不支持 key 或者 value 为 null 的原因?
为什么要 用cas算法
并发度是多少?
ConcurrentHashMap 迭代器是强一致性还是弱一致性?
其他JUC集合
锁 🔒
ReentrantLock
synchronized和ReentrantLock区别是什么?
实现
公平锁 和 非公平锁
可重入性
ReentrantReadWriteLock
实现原理
ReadWriteLock是什么?
自旋锁
乐观锁和悲观锁
分支主题
AQS
什么是AQS?
流程
分支主题
原理
了解AQS对资源的共享方式吗?
AQS使用了哪些设计模式?
线程池
为什么要用线程池?
Executor
示意图
分支主题
Executor和Executors的区别?
常用的JAVA线程池有哪几种类型?
Executors 提供了哪些创建线程池的方法?
流程
线程的5种状态
API
线程池核心参数
核心线程数
阻塞队列
使用队列的注意点
最大线程数
拒绝策略
keepAliveTime(保持存活时间
execute()vs submit()
shutdown() vs shutdownNow()
isTerminated() vs isShutdown()
实战
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
如何合理配置线程池参数?
源码
ctl
为啥要用一个int值表示两个组合状态
处理任务流程
为什么要有核心线程池
一些问题
核心线程怎么实现一直存活?
源码中线程池是怎么复用线程的?
非核心线程能成为核心线程吗?
非核心线程如何实现在 keepAliveTime 后死亡?
一个线程异常了会怎么样?
并发工具相关
Fork/Join框架
fork 和invokeAll 的区别
获得任务执行结果
三种submit()
Future
API
FutureTask 工具类
Semaphore 信号量
为什么要有?
是什么?
基于AQS的同步组件
CountDownLatch
原理
应用
不足
CyclicBarrier
CyclicBarrier
怎么用?
0 条评论
下一页