繁体   English   中英

Java中继承下的同步静态方法行为

[英]Synchronized static methods behaviour under inheritance in java

我在某处阅读:

如果静态同步方法位于不同的类中,则一个线程可以在每个类的静态同步方法中执行。 每个类一个线程,无论它调用哪种静态同步方法。

假设我有下面的类层次结构:

public class Base {
    public static synchronized void printBase() {
        System.out.println("Inside Base");
    }
}

public class Derived extends Base {
    public static synchronized void printDerived() {
        System.out.println("Inside Derived");
    }
}

1)如果我有以下两个函数调用:

Base.printBase();
Derived.printDerived();

据我了解,它们不应互相阻塞,并且两者可以同时执行。 由于调用是用不同的类进行的。

2)但是,如果我有以下两个函数调用:

Derived.printBase();
Derived.printDerived();

由于它们在同一类上被调用,因此应相互阻止。 对?

还是还有其他东西?

不,您在第2点中描述的行为不是您所看到的。

同步对象取决于方法的声明位置,而不取决于方法的调用方式。 JLS 8.3.4.6开始

对于类(静态)方法,使用与该方法的类的Class对象关联的监视器。

这里的“方法类”是Base.classprintBase ,以及Derived.classprintDerived 因此,代码大致相当于:

public class Base {
    public static void printBase() {
        synchronized (Base.class) {
            System.out.println("Inside Base");
        }
    }
}

public class Derived extends Base {
    public static void printDerived() {
        synchronized (Derived.class) {
            System.out.println("Inside Derived");
        }
    }
}

因此,无论如何调用,这两种方法都可以从不同的线程中调用,而不会互相阻塞。 (当然,如果其中一个线程已经拥有Derived.class的监视器,那将防止其他线程调用printDerived等-我只是在谈论这些方法如何相互影响。)

两种情况都不会导致线程被阻塞。 只有两个线程调用printBase才会引起阻塞。

在第二种情况下:

Derived.printBase();
Derived.printDerived();

Derived.printBase(); 实际上是对Base.printBase();的调用Base.printBase();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM