1、Java 对象头
我们以 Hotspot 虚拟机为例,Hotspot 的对象头主要包括两部分数据:Mark Word(标记字
段)、Class Pointer(类型指针)。
Mark Word:默认存储对象的 HashCode,分代年龄和锁标志位信息。这些信息都是与对象
自身定义无关的数据,所以 Mark Word 被设计成一个非固定的数据结构以便在极小的空间
内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间
Mark Word 里存储的数据会随着锁标志位的变化而变化。
Class Point:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类
的实例。
2、Monitor
Monitor 可以理解为一个同步工具或一种同步机制,通常被描述为一个对象。每一个 Java
对象就有一把看不见的锁,称为内部锁或者 Monitor 锁。
Monitor 是线程私有的数据结构,每一个线程都有一个可用 monitor record 列表,同时还有
一个全局的可用列表。每一个被锁住的对象都会和一个 monitor 关联,同时 monitor 中有
一个 Owner 字段存放拥有该锁的线程的唯一标识,表示该锁被这个线程占用。
三、锁
无锁
无锁是指没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线
程能修改成功。
无锁的特点是修改操作会在循环内进行,线程会不断的尝试修改共享资源。如果没有冲突就
修改成功并退出,否则就会继续循环尝试。如果有多个线程修改同一个值,必定会有一个线
程能修改成功,而其他修改失败的线程会不断重试直到修改成功。
偏向锁
引入偏向锁的主要目的是:为了在无多线程竞争的情况下尽量减少不必须要的轻量级锁执行
路径。其实在大多数情况下,锁不仅不存在多线程竞争,而且总是由同一个线程多次获取,
所以引入偏向锁就可以减少很多不必要的性能开销和上下文切换。
评论0
最新资源