synchronized优化-CAS和java对象头

456 阅读3分钟

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和_metadata。 一部分用于存储自身运行时的数据,称之为mark word,另外一部分是类型指针,及对象指向它的类元数据的指针。

Mark Word

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

Klass pointer

用来表示这个对象是哪个类产生的,保存类的元信息。

实例数据

就是类中定义的成员变量

对其填充

java对象小结

Java对象由3部分组成,对象头,实例数据,对齐数据。

对象头分成两部分:Mark Word + Kclass pointer