需要了解的基础知识:
- 对象在堆内存中的存储区域包括哪几部分, 对象头是什么?
2.锁的四种状态.
3.HotSpot通过markOop类型实现Mark Word.
一. HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。对象头又分为mark word标记字段和klass pointer类型指针.
对象的存储布局.png
Monitor 可以理解是一个同步工具或一种同步机制,通常被描述为一个对象。每一个java对象就有一把看不见的锁,称为内部锁或Monitor锁。
依赖于底层的操作系统的Mutex Lock 互斥锁来实现的线程同步。
Monitor是线程私有的数据结构。
每一个线程都有一个可用monitor record列表,同时还有一个全局的可用列表。
每一个被锁住的对象都会和一个monitor关联,同时monitor中有一个Owner字段存放拥有该锁的线程的唯一标识,表示该锁被这个线程占用。
二.锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。
无锁:CAS
偏向锁:在大多数情况下,锁总是由同一个线程多次获得,不存在多线程竞争。在对象头mark
word里存储偏向的线程ID。偏向锁只有在遇到其他线程尝试竞争偏向锁的时候,持有锁
的线程才会释放锁。 偏向锁的撤销,需要等待全局安全点。
轻量级锁:其他线程会通过自旋的形式尝试获取,不会阻塞,从而提高性能。
重量级锁:其他线程被阻塞。
三、对象的内存分配流程:
对象分配流程.png
网友评论