锁定“Class”类对象的实现以进行同步

时间:2013-08-01 17:14:07

标签: java multithreading synchronization jls mutual-exclusion

我正在经历this link。根据这个:

  

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

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

3 个答案:

答案 0 :(得分: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 :(得分:1)

  

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

只有同步 静态方法才需要线程来获取对象的锁定。所有 synchronized 实例方法都需要相关的实例对象的锁定,而不是共享。

答案 2 :(得分:1)

  

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

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