CAS
CAS:compare and swap(比较相同再交换)。是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。
CAS作用:CAS可以将比较和交换转换为原子操作,这个原子操作直接有CPU保证。CAS可以保证共享变量赋值时的原子操作。CAS操作依赖3个值,内存中的值V,旧的预估值X,要修改的新值B,如果旧的预估值X等于内存中的值V,就将新的值B保存到内存中。

CAS原理

乐观锁和悲观锁
悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞。因此synchronized称之为悲观锁。jdk中的reentrantLock也是一种悲观锁。性能较差。
乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,就算改了也没关系,再重试即可。所以不会上锁,但是在更新的时候会判断在此期间别人有没有修改这个数据,如果没有人修改则更新,如果有人修改则重试。
CAS这种机制我们也可以称其为乐观锁。综合性能较好。
CAS在获取共享变量时,为了保证该变量的可见性,需要使用volatile修饰。结合CAS和volatile可以实现无锁并发,适用于竞争不激烈,多核CPU下:
1.因为没有使用synchronized,所以线程不会陷入阻塞,这是效率提升的因素之一。
2.但如果竞争激烈,可以想到重试必然频繁发生,反而效率会受到影响。
CAS小结
CAS的作用?Compare and swap,CAS可以将比较和交换转化为原子操作,这个原子操作直接由处理器保证。
CAS的原理?CAS需要3个值:内存地址V,旧的预估值A,要修改的值B,如果内存地址V和旧的预估值A相等就修改内存地址值为B。
synchronized锁升级
无锁--》偏向锁--》轻量级锁--》重量级锁
java对象的分布
在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。

Mark Word
Mark Word用于存储对象自身的运行时数据,如哈希码(hashcode)、GC分代年龄、锁状态标志、线程持有锁、偏向线程id、偏向时间等等,占用内存大小与虚拟机位长一致。

Klass pointer
用来表示这个对象是哪个类产生的,保存类的元信息。
实例数据
就是类中定义的成员变量
对其填充

java对象小结
Java对象由3部分组成,对象头,实例数据,对齐数据。
对象头分成两部分:Mark Word + Kclass pointer