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