CAS与锁的相关底层知识一

一、什么是CAS

1、概念

2、原理:

用到汇编指令:lock cmpxchg ,其中cmpxchg分为比较和替换两步,不是原子的,所以用lock保证原子性

lock会将某个内存地址上锁,不让其他cpu访问

 

2、ABA问题:用版本号去解决

二、JUC包-java.util.concurrent

 

三、用户态、内核态

使用synchronize获取锁需要经过用户态转化为内核态,返回锁是又从内核态转化为用户态

 

四、对象的内存布局

new出来的对象在内存中是怎么分布的?这个跟虚拟机实现有关,不同虚拟机的布局不同,我们只关心hospot的实现。

CAS与锁的相关底层知识一

对象字节数必须是8的整数倍,所以对齐填充就是为了保证对象大小是8的整数倍的。

 

那么markwork中包含了哪些信息呢?我们只关心64位的哈,如下图:

CAS与锁的相关底层知识一

 

五、可重入锁

可重入次数要记录下来,因为有几次重入就要进行几次解锁

偏向锁:记录在线程栈里,每加一次锁就往线程栈中压入一个LR

 

六、自旋锁位什么要升级为重量级锁

原因是,少量线程(一般是cup核数的一半)自旋没问题,但是大量线程自旋就会浪费cup资源了