当前位置: 首页 > 知识库问答 >
问题:

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

唐麒
2023-03-14

我在某处读到:

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

假设我有以下类层次结构:

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个答案

韦胜泫
2023-03-14

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

在第二种情况下:

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

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

勾通
2023-03-14

不,你在第2点描述的行为不是你将要看到的。

同步对象取决于方法的声明位置,而不是调用方法的方式。来自JLS 8.3.4.6:

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

这里的“方法类”是< code>printBase的< code>Base.class,以及< code>printDerived的< code>Derived.class。所以这段代码大致相当于:

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");
        }
    }
}

因此,无论如何调用这两个方法,都可以从不同的线程调用它们,而不会相互阻塞。(当然,如果其中一个线程已经拥有DerivedClass的监视器,这将阻止另一个线程调用printDerived等-我只讨论这些方法如何相互作用。)

 类似资料:
  • 我的目标是创建一个抽象类,它的静态方法必须被实现,但是由于静态方法不能被抽象,我有一些问题。 这就是我提出的解决方案: 我写这篇文章是因为我找不到任何等价的答案,这让我想知道这在Java中是否是惯用的。

  • 主要内容:1 什么是Java静态同步方法,2 没有静态同步方法的问题,3 静态同步方法的例子1,4 静态同步方法的例子21 什么是Java静态同步方法 如果将任何静态方法设置为synchronized(同步),则锁定的是类而不是对象。 2 没有静态同步方法的问题 假设有两个共享类(例如:Table类)的对象,分别名为object1和object2。在使用同步方法和同步代码块的情况下,t1和t2或t3和t4之间不会存在干扰,因为t1和t2都引用了一个具有单个锁,但是t1和t3或t2和t4之间可能存

  • 问题内容: 这是我在此链接上找到的一段文字。 “避免锁定静态方法 最糟糕的解决方案是将“ synchronized”关键字放在静态方法上,这意味着它将锁定此类的所有实例。” 为什么同步静态方法会锁定该类的所有实例?它不应该锁定课程吗? 问题答案: 这是我的测试代码,表明您是正确的,并且本文有点过分谨慎: 印刷品: 因此与实例的方法无关… 当然,如果整个系统都使用这些方法,那么您可以期望它们对多线程

  • 当两个线程同时使用不同的实例调用静态同步方法时会发生什么?可能吗?对象锁用于非静态同步方法,但静态同步方法使用什么类型的锁?

  • 本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对

  • 问题内容: 我正在阅读Khalid Mughal 撰写的Java™SCJP认证程序员指南。 在“继承”一章中,它说明了 成员的继承与声明的可访问性紧密相关。如果超类成员可以通过子类中的简单名称来访问(不使用任何其他语法,如super),则该成员被视为继承的 它还提到静态方法不是继承的。但是下面的代码完全可以: 我如何直接在课堂上使用?甚至更多,也可以。 这本书的解释仅适用于实例方法吗? 问题答案: