2020-10-24 随笔:什么是CAS,Object object = new Object(); 这样创建对象在系统内存中如何布局的

为了面试做准备,最近复习了一下CAS,原理和ABA问题。

什么是CAS

CAS简单来说就是 比较并交换
是用户态操作(操作系统可以分为 用户态,内核态两个区。)
Cpu支持cas,一般现在的cpu都是多核的。
cas 在java 中的提现:Java中unsafe方法调用底层c++实现。c++ 中的unsafe 方法,c++ 可以调用操作系统底层。解释一下cas就是为了不惊动操作系统的重量级锁,也就是锁总线。来实现锁的机制。cpu从内存中读到值然后经过计算,在回写到内存中,这时候的方法就是判断读到的值跟不跟现在的一样,也就是所谓的比较一下。如果一样就修改内存中的值为cpu计算过的值。ABA 就是这个内存中的值可能改变过但是又变回原来的值。这时候就需要加一个版本号来判断就可以了。不知道这样解释你明白了吗?
AbA问题用版本号解决

对象布局
1.Mark word 三个作用  记录锁信息,记录gc信息,记录hashcode也就是identify hashcode
2.记录对象信息,对象指针
3.记录成员变量
4.对象对齐,字节码要被8整除才可以高效

锁升级的过程:下面是个人的愚钝认识

偏向锁,因为多数情况锁只会被一个线程占用,所以很少有竞争。没有锁竞争,所以给贴的偏向锁。贴的过程是cas操作。第一个线程持有偏向锁,第一个线程的指针给贴上去就是偏向锁。90%的时间就一个线程,如果设计个竞争的锁很是浪费时间跟资源。
00 01 10 11状态  这些都是markword中的锁标志位,可以用jcl打印到控制台,01标志位分两种,001跟101。001是无锁态,101就是偏向锁。00是无锁,或者叫轻量级锁(自旋锁
偏向锁有很多规则。
如果有线程竞争了就会升级为轻量级锁,或者叫自旋锁,有的也管这个无锁。所谓的无锁就是没有跟操作系统申请重量级锁。

猜你喜欢

转载自blog.csdn.net/AntdonYu/article/details/109262288
今日推荐