sychrionzed的底层原理:
实例数据:存放类的属性数据信息,包括父类的属性信息;
对齐填充:由于虚拟机要求 对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐;根据寻址优化算法
synchrionzed用的锁就是存在对象头中。hotspot虚拟机的对象头主要包括两部分:MarkWord(标记字段),ClassPointer(类型指针)。其中classPointer时对象指向它类元数据的指针。虚拟机通过这个这个指针可以确定这个对象指向哪一个实列。
锁虽然解决了数据的安全性,但是同时也带来了 性能的下降。sychronized在JDK1.6后引入锁升级的优化。
锁升级的原理:
偏向锁:在锁对象的对象头中记录一下本次获取锁的线程对应的id,如果下次再来获取锁
就可以支持获取到。也就是支持 锁重入。
轻量级锁:当偏向锁升级而来的,当一个线程获取到锁后,此时这把锁时偏向锁,如果此时有
第二个线程来竞争锁,偏向锁就会升级轻量级锁,之所以成为轻量级锁,是为了和重量级锁区分开来的,
轻量级锁底层时通过自选来实现的,并不会阻塞线程。
如果自旋次数过多任然没有获取锁,就会升级重量级锁,重量级锁
自旋锁
线程的阻塞和唤醒需要CPU从用户态转为核心态,频繁的阻塞和唤醒对CPU来说是一件负担很重的工作,势必会给系统的并发性能带来很大的压力。同时我们发现在许多应用上面,对象锁的锁状态只会持续很短一段时间,为了这一段很短的时间频繁地阻塞和唤醒线程是非常不值得的。
所以引入自旋锁,何谓自旋锁?
所谓自旋锁,就是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。
\