Java多线程面试高配问题---多线程(2)🧵

xiaolifc / 2024-03-20 / 原文

Java多线程

线程安全知识

1. synchronized关键字的底层原理


底层是一个monitor,在class文件中体现,加锁,解锁,为了防止代码出现bug,最后又解锁了一次,相当于一个try catch finally代码块。

Monitor实现
lock对象关联一个monitor

初级总结

2. synchronized关键字的底层原理-进阶

没有竞争的情况下可以用偏向锁与轻量级锁,一旦发生竞争,锁需要升级为重量级锁

monitor与lock对象是怎么关联上的?

要明白这些,首先要知道对象的内存结构。

对象头,实例数据,对齐填充(无意义的数据),为了保证字节是8的整数倍。
MarkWord-32bit

通过markword中的指针地址相关联

轻量级锁



偏向锁

偏向锁只有重入的第一次才做CAS操作,后面只是记录一下,判断上面的线程ID是不是自己

三种锁的对比

3. JMM(Java Memory Model)Java内存模型


通过主内存同步数据

4. CAS(Compare And Swap)


CAS流程

CAS底层实现
调用了操作系统的CAS指令,java 在 unsafe 类中,native 修饰的是操作系统底层的函数,由C或者C++实现的。

乐观锁与悲观锁

volatile关键字



代码运行之后,发现线程 3 还是一直在执行, 因为 jit 对我们的代码做了优化