Java多线程基础:对象内存布局和锁

Java多线程基础:Synchronized关键字

对象的内存布局

  下面的讨论都是针对HotSpot虚拟机

  首先我们来了解一下对象的内存布局,对象在内存中存储的布局整体可以分为3块区域

  

  如上图可见呢,Mark Word 专门有2 bit 用于存储锁标志位,由于Mark Word空间复用,存储的内容也是会变化的,如下:

  

 

轻量级锁

  轻量级锁是JDK1.6之中新加入的新型锁机制,他的本意是在没有多线程竞争的前提下减少传统的重量级锁使用操作系统互斥量产生的性能消耗。即如果有两条以上的线程争用同一个锁,那轻量级锁就不再有效,要膨胀为重量级锁,即“10”。原理是,对于绝大多数的锁,在整个同步周期内都是不存在竞争的,这是一个经验依据。

  简而言之,如果不存在竞争,那就可以避免使用互斥量,如果存在竞争,仍需要使用互斥量,且性能会较慢。

说明:需要注意的是,轻量级锁依赖于CAS方法,即比较和交换,来更新Mark Word的内存为指向锁记录的指针。

偏向锁

  偏向锁也是JDK1.6中引入的一项锁优化。目的是在无竞争的情况下把整个同步都消除掉,包括CAS操作。这个锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他线程获取,则持有偏向锁的线程讲永远不需要进行同步。但是一旦有另外一个线程去尝试获取这个锁时,偏向模式就宣告结束,撤销偏向后恢复到未锁定(01)或轻量级锁定(00)状态。

 

 

参考资料

  • 《深入理解Java虚拟机》

 

  

 

 

 

 

  

 

posted @ 2020-06-01 11:17  子烁爱学习  阅读(300)  评论(0编辑  收藏  举报