gpt4 book ai didi

Java同步方法问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:42:23 25 4
gpt4 key购买 nike

我有两个同步方法的类:

class Service {

public synchronized void calc1();

public synchronized void calc2();

}

两者都需要相当长的时间来执行。问题是这些方法的执行是否会相互阻塞。 IE。两种方法可以在不同的线程中并行执行吗?

最佳答案

它们不能在同一服务上并行执行 - 两种方法共享同一个监视器(即 this),因此如果线程 A 正在执行 calc1,线程B将无法获得监视器,因此无法运行calc2。 (请注意,线程 B 可以在 Service 的不同实例 上调用任一方法,因为它会尝试获取不同的、未持有的监视器,因为 this 有问题会有所不同。)

最简单的解决方案(假设您希望它们独立运行)是使用显式监视器执行如下操作:

class Service {
private final Object calc1Lock = new Object();
private final Object calc2Lock = new Object();

public void calc1() {
synchronized(calc1Lock) {
// ... method body
}
}

public void calc2() {
synchronized(calc2Lock) {
// ... method body
}
}

}

所讨论的“锁”不需要有任何特殊的能力,除了是对象,因此有一个特定的监视器。如果您有更复杂的要求,可能涉及尝试锁定并立即回退,或者查询谁持有锁,您可以使用实际的 Lock对象,但对于基本情况,这些简单的 Object 锁就可以了。

关于Java同步方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6451154/

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