我正在通过this link。据此:“Class”类对象锁定实现同步
类锁实际上是作为对象锁实现的。当JVM加载一个类文件时,它创建一个类java.lang.Class的实例。当你锁定一个类时,你实际上锁定了该类的Class对象。
但是根据Java规范,堆上相同类型(类)的所有对象共享单个Class对象。 那么对于多线程同步访问Objects的情况如何呢?
我正在通过this link。据此:“Class”类对象锁定实现同步
类锁实际上是作为对象锁实现的。当JVM加载一个类文件时,它创建一个类java.lang.Class的实例。当你锁定一个类时,你实际上锁定了该类的Class对象。
但是根据Java规范,堆上相同类型(类)的所有对象共享单个Class对象。 那么对于多线程同步访问Objects的情况如何呢?
类锁
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对象。那么对于多线程同步访问对象,这怎么可能呢?
只有同步静态方法将需要线程获取类对象的锁。所有同步的实例方法都需要相关的实例对象的锁,它不共享。
但是根据java规范,堆 上的所有同类型(类)的对象共享单个Class对象。那么对于多线程 同步访问对象,这怎么可能是真的?
类级锁在静态方法中更有意义。如果在静态方法上使用synchronized关键字,则其监视器用于锁定的对象是类对象,即由文字Class.class表示的对象。
@assylias你是对的。我想表明,对象是什么并不重要,但不想与“对象”这个词混淆。 –