我正在经历this link。根据这个:
类锁实际上是作为对象锁实现的。当JVM加载类文件时,它会创建类java.lang.Class的实例。锁定类时,实际上是锁定了该类的Class对象。
但是根据java规范,堆上相同类型(类)的所有对象共享单个Class对象。 那么对于对象的多线程同步访问怎么会这样呢?
答案 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表示的对象。