人们谈论两种多线程锁定——对象锁和类锁。据我所知,只有在对象上才能进行锁定。
案例1:我们使用new或工厂方法等创建的对象。
我认为这也是一种对象锁,因为类被加载到JVM的方法区中,类的所有静态属性都被包装在JVM创建的一个
所以我可以推断出另一件事。正如线程锁定的对象在未被第一个线程释放之前不能被另一个线程获取一样,类锁定(
案例1:我们使用new或工厂方法等创建的对象。
void synchronized myMethod(Type param) {
//will lock on the instance used to call this method
}
或者
synchronized(this) {
//will lock on current object
}
或者
synchronized(obj1) {
//will lock on specified obj1 object
}
案例2:关于java.lang.Class
对象
这被称为类锁,可与静态字段、方法或块一起使用,因为它们属于类并在所有对象之间共享,并且与其他类属性一起使用。
static void synchronized method() {
//will lock the Class object
}
或者
static {
synchronized(SomeClass.class){
int a = 2;
}
}
我认为这也是一种对象锁,因为类被加载到JVM的方法区中,类的所有静态属性都被包装在JVM创建的一个
java.lang.Class
对象中。因此,在抽象层面上它是对象锁,在图中我们看到了类锁。所以我可以推断出另一件事。正如线程锁定的对象在未被第一个线程释放之前不能被另一个线程获取一样,类锁定(
java.lang.Class
实例)也是以同样的方式工作的。
我想知道在同步静态方法的情况下,线程在以下两种情况下会获取哪个类的锁:
- 该方法是从定义它的相同类中调用的。
- 该方法是通过派生类和派生类名称调用的。
这是我对这个主题的理解。请添加或更正。