Java多线程基础:Synchronized关键字
对象的内存布局
下面的讨论都是 针对HotSpot虚拟机。
首先我们来了解一下对象的内存布局,对象在内存中存储的布局整体 可以分为3块区域:
如上图可见呢,Mark Word 专门有2 bit 用于存储锁标志位,由于 Mark Word空间复用,存储的内容也是会变化的,如下:
轻量级锁
轻量级锁是JDK1.6之中新加入的新型锁机制,他的本意是 在没有多线程竞争的前提下, 减少传统的重量级锁使用操作系统互斥量产生 的性能消耗。即如果有两条以上的线程争用同一个锁,那轻量级锁就不再有效,要膨胀为重量级锁,即”10″。原理是, 对于绝大多数的锁,在整个同步周期内都是不存在竞争的,这是一个经验依据。
简而言之, 如果不存在竞争,那就可以避免使用互斥量,如果存在竞争,仍需要使用互斥量,且性能会较慢。
说明:需要注意的是, 轻量级锁依赖于CAS方法,即比较和交换,来更新Mark Word的内存为指向锁记录的指针。
偏向锁
偏向锁也是JDK1.6中引入的一项锁优化。目的是在 无竞争的情况下把整个同步都消除掉,包括CAS操作。这个锁会 偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他线程获取,则持有偏向锁的线程讲永远不需要进行同步。但是 一旦有另外一个线程去尝试获取这个锁时,偏向模式就宣告结束,撤销偏向后恢复到未锁定(01)或轻量级锁定(00)状态。
参考资料
- 《深入理解Java虚拟机》
Original: https://www.cnblogs.com/MrSaver/p/13024132.html
Author: 子烁爱学习
Title: Java多线程基础:对象内存布局和锁
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538044/
转载文章受原作者版权保护。转载请注明原作者出处!