0

我正在通过这个链接。根据这个 :

类锁实际上是作为对象锁实现的。当 JVM 加载一个类文件时,它会创建一个 java.lang.Class 类的实例。当您锁定一个类时,您实际上是在锁定该类的 Class 对象。

但是根据 java 规范,堆上所有相同类型(类)的对象共享一个 Class 对象。那么对于对象的多线程同步访问来说,这怎么可能呢?

4

3 回答 3

2

类锁

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实例监视器。

于 2013-08-01T17:18:58.700 回答
1

但是根据 java 规范,堆上所有相同类型(类)的对象共享一个 Class 对象。那么对于对象的多线程同步访问来说,这怎么可能呢?

类级别的锁在静态方法中更有意义。如果在静态方法上使用 synchronized 关键字,其监视器用于锁定的对象是类对象,即由字面量 Class.class 表示的对象。

于 2013-08-01T17:24:01.683 回答
1

但是根据 java 规范,堆上所有相同类型(类)的对象共享一个 Class 对象。那么对于对象的多线程同步访问来说,这怎么可能呢?

只有同步的 静态方法需要线程来获取对象的锁。所有同步的实例方法都需要相关实例对象的非共享锁。

于 2013-08-01T17:22:05.107 回答