文章目录
视频地址
面试题
请描述synchrnoized和reentrantlock的底层实现及重入的底层原理-百度 阿里
请描述锁的四种状态和升级过程-百度 阿里
CAS的ABA问题如何解决-百度
请谈一下AQS,为什么AQS的底层是CAS+volatile-百度
请谈一下你对volatile的理解-美团 阿里
volatile的可见性和禁止指令重排序是如何实现的-美团
CAS是什么-美团
请描述一下对象的创建过程い美团 顺丰
对象在内存中的内存布局-美团 顺丰
DCL单例为什么要加volatile-美团
解释一下锁的四种状态-顺丰
Objecto=new Object()在内存中占了多少字节?-顺丰
请描述synchronized和ReentrantLock的异同
聊聊你对as-if-serial和 happens-before 语义的理解-京东
你了解ThreadLocal吗?你知道ThreadLocal中如何解决内存泄漏问题吗?-京东 阿里
请描述一下锁的分类以及JDK中的应用-阿里
基础知识
计算机组成
控制单元(CU)、寄存器、算术逻辑单元(ALU)、时钟、缓存cache、总线、输入输出控制器(IO)
内存到CPU 通过总线,
总线分三种类型:控制线 地址线 数据线
CPU速度对比
cpu 是硬盘的100万倍。
进程与线程
共享空间但不共享数据。
进程的静态概念:程序进入内存,就会分配对应资源:内存空间 ,进程进入内存,同时产生一个主线程
线程是动态的是可执行的计算单元。CPU执行的基本单位。
线程的切换 context switch
保存上下文,保存现场。 程序计数器,保存线程数据到cache。
线程的公式
CPU的并发控制
当多个CPU访问同一份数据时怎么保证数据的一致性。
(1)关中断
(2)缓存一致性协议
(3)系统屏障
(4)总线/缓存锁
缓存一致性协议
CPU的速度与内存的速度是100:1
ALU 计算单元 访问 寄存器 速度,与访问内存的速度
MESI cache缓存一致性协议
英特尔CPI 使用MESI
引入 缓存行的概念,一次去 64bety 到 cache中。
验证。
long p1 , p2,p3,p4,p5,p6,p7;
long x = 0L;
long p9,p10,p11,p12,p13,p14 ,p15;
如果 x y 位于同一行 ,x y 在两边的L3中都有缓存, 修改需要通知另外一个CPU,使数据保持一致。
两个线程分别子啊不同的 CPU 中运行,减少了通知的时间。例子:LinkedBlockingDeque
CAS 的实现
CAS的全称是Compare-And-Swap,它是CPU并发原语,,,比较并交换
它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的
对象内存布局
了解java内存工具 JOL = java object layout
一般java是一个64位,8字节指针长度应该是64位,但是由于默认开启 UserCompressedclassPointers 将8字节 压缩为4字节。
UserCompressedOops “ordinary object pointer” 普通对象指针, 对象中有一个String 指向了另一个对象 , 对象指针指向了String指针,这个指针的长度默认也是被压缩为4字节。
object 类的内存占用情况:
markWord 8 byte
class pointer 4byte 用于判断对象是属于哪一个class的(object.class或 user.class)
实例数据 0 byte
padding 对齐 4byte (被8整除)
synchronized原理详解
偏向锁、轻量级锁(无锁、自旋锁)、重量级锁
名称 | 描述 |
---|---|
偏向锁 | 单线程下 |
轻量级锁(无锁、自旋锁) | 有人争用 |
重量级锁 | 竞争激烈升级 |
synchronized实现过程
- Java代码synchronized:class文件层面 Monitor enter Monitor exit 。
- 在JVM 执行过程中进行锁升级
- 操作系统层面 lock comxchg
volatile
CPU指令重排
指令重排序演示
volatile 底层实现
强软弱虚 JAVA中的引用类型
threadLocal
spring 的@transactional注解
@transactional
m(){
m1();
m2();
}
需要保证 m1与m2拿到的数据库链接是同一个。
使用threadLocal实现的,只要是当前线程,conniction拿到的是同一个。
threadLocal 源码 使用了弱引用。防止内存泄漏。
如果threadLocal 中对象不使用需要手动调用 remove方法,否则会内存泄漏。