返回

揭秘 Java 锁机制下的对象内存布局,轻松理解锁升级

后端

探索 Java 对象的内部世界:内存布局与锁机制

对象内存布局:窥探 Java 对象的内部

Java 对象在内存中的结构至关重要,因为它影响着访问效率和并发性能。在 HotSpot 虚拟机中,对象内存布局分为三部分:

对象头: 存储对象的基本信息,例如类型、哈希码和锁状态。

class Person {
  private String name;
  private int age;
}

对象头示例:

00000001 00000001 00000001 00000001 00000001 00000001 00000001 00000001
└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
    mark word                                                          instance data

实例数据: 存储对象实例的实际数据(字段值)。

00000001 00000001 00000001 00000001 00000001 00000001 00000001 00000001
└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
            mark word                         instance data: name = "John Doe"

对齐填充: 确保对象占用的内存空间是内存地址的整数倍,提高内存访问效率。

00000001 00000001 00000001 00000001 00000001 00000001 00000001 00000001
└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
              mark word                           instance data: name = "John Doe"
                        padding

Mark Word:Java 锁机制的核心

Mark Word 是锁机制的心脏,存储着对象的状态信息,例如锁状态和线程 ID。

00000001 00000001 00000001 00000001 00000001 00000001 00000001 00000001
└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
           mark word: (unlocked)                             instance data: name = "John Doe"

锁状态示例:

00000001 00000001 00000001 00000001 00000001 00000001 00000001 00000001
└───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
           mark word: (locked by thread 123)                             instance data: name = "John Doe"

锁升级:从偏向锁到重量级锁

当对象竞争激烈时,JVM 会将锁类型从轻量级升级为重量级,以提高并发性能。这个过程被称为锁升级。

public synchronized void transferFunds(Account from, Account to, int amount) {
  // synchronized 方法使用重量级锁
}

public void transferFunds(Account from, Account to, int amount) {
  synchronized (this) {
    // 显式使用 synchronized 代码块使用重量级锁
  }
}

Java 锁机制:并发编程的基石

Java 锁机制提供了同步访问共享资源的手段,保证并发编程的安全。

Lock lock = new ReentrantLock();
lock.lock();
try {
  // 受保护的共享资源访问
} finally {
  lock.unlock();
}

常见问题解答

1. 什么是对象头?
对象头存储有关对象的信息,例如类型、哈希码和锁状态。

2. Mark Word 是什么?
Mark Word 是锁机制的核心,它存储有关对象锁状态的信息。

3. 锁升级是什么?
锁升级是 JVM 将锁类型从轻量级提升到重量级的过程,以提高并发性能。

4. Java 锁机制有什么好处?
Java 锁机制通过同步访问共享资源来确保并发编程的安全。

5. 如何实现自定义锁?
可以通过实现 Lock 接口来实现自定义锁。