Java并发机制的底层实现原理

2018-09-26  本文已影响0人  smallAttr

volatile的应用

synchronized的实现原理与应用

相信绝大数人在脑海里对synchronized的第一印象就是重量级锁,性能消耗特别高,不到万不得一最好不要使用synchronized,当然了,在1.6版本之前确实是这样的,但是在1.6版本对synchronized进行了优化,其中最主要的就是引入了偏向锁、轻量级锁。后续会有所提及。

记住synchronized是通过JVM实现的,如果修饰的同步块,与之对应的命令monitorentermonitorexit。如果是同步方法,则是依靠方法修饰符上的ACC_SYNCHRONIZED

Java对象头的存储结构(32位JVM)

锁状态 25bit 4bit 1bit(偏向锁) 2bit(锁标志位)
无锁状态 对象的hashCode 对象分代年龄 0 01

Java对象头的存储结构(64位JVM)
不支持HTML标签,只能截图了


image.png

无锁状态->偏向锁状态->轻量级锁状态->重量级锁状态(只能升级不能降级)

偏向锁

初次获取锁的时候,将自身的ThreadID写入到mark word的ThreadId字段内,并且将偏向锁的状态置为1。如果再有线程来获取锁的时候,直接比较ThreadID是否一致。

轻量级锁

两个线程竞争,其中只会有一个竞争成功,另外一个进行自旋CAS。

锁的优缺点对比及适用场景

优点 缺点 适用场景
偏向锁 加锁和解锁不需要额外的消耗,和执行非同步方法相比仅存在纳秒级的差距 如果线程间存在锁竞争,会带来额外的锁撤销的消耗 使用只有一个线程访问同步块场景
轻量级锁 竞争的线程不会阻塞,提高了程序的响应速度 如果始终得不到锁竞争的线程,使用自旋会消耗CPU 追求响应时间,同步块执行速度非常快
重量级锁 线程竞争不适用自旋,不会消耗CPU 线程阻塞,响应时间缓慢 追求吞吐量,同步块执行速度较长

原子操作的实现原理

上一篇 下一篇

猜你喜欢

热点阅读