我正在通过这个链接。根据这个 :
类锁实际上是作为对象锁实现的。当 JVM 加载一个类文件时,它会创建一个 java.lang.Class 类的实例。当您锁定一个类时,您实际上是在锁定该类的 Class 对象。
但是根据 java 规范,堆上所有相同类型(类)的对象共享一个 Class 对象。那么对于对象的多线程同步访问来说,这怎么可能呢?
我正在通过这个链接。根据这个 :
类锁实际上是作为对象锁实现的。当 JVM 加载一个类文件时,它会创建一个 java.lang.Class 类的实例。当您锁定一个类时,您实际上是在锁定该类的 Class 对象。
但是根据 java 规范,堆上所有相同类型(类)的对象共享一个 Class 对象。那么对于对象的多线程同步访问来说,这怎么可能呢?
类锁
synchronized (String.class) {...}
对象锁
//doesn't matter what the lock object is as long as it's not null
private final Object lock = new Object();
...
synchronized (lock) {...} // will throw NPE if lock is null
它们都被视为object
锁,因为String.class
返回Class<String>
.
在类锁中,线程获取Class<String>
实例监视器。在对象锁中,线程获取String
实例监视器。
但是根据 java 规范,堆上所有相同类型(类)的对象共享一个 Class 对象。那么对于对象的多线程同步访问来说,这怎么可能呢?
类级别的锁在静态方法中更有意义。如果在静态方法上使用 synchronized 关键字,其监视器用于锁定的对象是类对象,即由字面量 Class.class 表示的对象。
但是根据 java 规范,堆上所有相同类型(类)的对象共享一个 Class 对象。那么对于对象的多线程同步访问来说,这怎么可能呢?
只有同步的 静态方法需要线程来获取类对象的锁。所有同步的实例方法都需要相关实例对象的非共享锁。