gpt4 book ai didi

java - 类中同步方法组合的线程行为

转载 作者:搜寻专家 更新时间:2023-11-01 02:54:27 24 4
gpt4 key购买 nike

案例一

我有 2 个同步方法,如下所示:

class A {
public void synchronized methodA() {}
public void synchronized methodB() {}
}

答:我有线程 T1 和 T2。线程能否同时执行属于类 A 的相同实例的methodAmethodB

  • 我的分析:答案是,因为线程 T1 只会执行一个方法,线程 T2 将被阻塞,直到 T1 完成执行。

B:我有线程 T1 和 T2。线程能否同时执行属于类 A 的不同实例的methodAmethodB

  • 我的分析:答案是,因为T1和T2可以执行属于类A的不同实例的methodAmethodB,它们将不被阻止。

根据我对案例 1 的分析,我的理解是否正确?

更新:案例 2

我有 2 个同步方法,一个是非静态的,另一个是静态的。

class A {        
public void synchronized methodA() {}
public void static synchronized methodB() {}
}

答:我有线程 T1 和 T2。线程能否同时执行属于类 A 的相同实例的methodAmethodB

  • 我的分析:答案是,因为T1 只会执行一个方法,而T2 将被阻塞,直到T1 完成执行。

B:我有线程 T1 和 T2。线程能否同时执行属于类 A 的不同实例的methodAmethodB

  • 我的分析:答案是,因为T1和T2可以执行属于不同实例的methodAmethodB,它们不会被阻塞.

根据我对案例 2 的分析,我的理解是否正确?

最佳答案

情况 A:否

情况 B:是

您的分析是正确的。实例方法上的 synchronized 关键字在功能上等同于:

public void someMethod() {
synchronized(this) {
//code
}
}

由于 this 在这两个上下文中是不同的,因此它们并不相互排斥。请注意,即使是同一个方法也可能同时被两个不同的实例调用。

编辑

对于情况 2,你在 2A 上是不正确的;它甚至没有意义。静态同步方法不“属于”类的实例;如果它这样做,它就不会是静态的!它不会在类的任何 实例上同步(它没有对要同步的实例的引用!)所以它会在A 的类对象上同步。 A 类中的静态同步方法等价于此:

public static void methodB() {
synchronized (A.class) {
//code
}
}

如上所示,您的实例方法将在实例上同步,因此两个线程可以并行运行。

那么在情况 B 中,显然它们也可以并行运行,但您仍然缺少静态方法不与任何实例关联的基本概念。

关于java - 类中同步方法组合的线程行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4490498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com