2013-08-01 107 views
0

我正在通过this link。据此:“Class”类对象锁定实现同步

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

但是根据Java规范,堆上相同类型(类)的所有对象共享单个Class对象。 那么对于多线程同步访问Objects的情况如何呢?

回答

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

+1

@assylias你是对的。我想表明,对象是什么并不重要,但不想与“对象”这个词混淆。 –

1

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

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

1

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

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