我在某处读到:
如果静态同步方法位于不同的类中,则一个线程可以在每个类的静态同步方法中执行。每个类一个线程,无论它调用哪个静态同步方法。
假设我有以下类层次结构:
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();
他们应该被对方屏蔽,因为他们被称为同一个班级。对吗?
还是还有别的原因?
两种情况都不会导致线程阻塞。只有两个线程调用printBase
的情况才会导致阻塞。
在第二种情况下:
Derived.printBase();
Derived.printDerived();
Derived.printBase();
实际上是对Base.printBase();
的调用。
不,你在第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),则该成员被视为继承的 它还提到静态方法不是继承的。但是下面的代码完全可以: 我如何直接在课堂上使用?甚至更多,也可以。 这本书的解释仅适用于实例方法吗? 问题答案: