gpt4 book ai didi

跨对象的 Java 同步

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:33 26 4
gpt4 key购买 nike

我正在努力确保我了解 java 中同步的性能影响。我有几个简单的类:

public class ClassOne {

private ClassTwo classTwo = new ClassTwo();

public synchronized void setClassTwo(int val1, int val2) {
classTwo.setVal(val1);
classTwo.setVal2(val2);
}

public static void main(String[] args) {
ClassOne classOne = new ClassOne();
classOne.setClassTwo(10, 100);
}

}

public class ClassTwo {

private int val;
private int val2;

public synchronized void setVal(int val) {
this.val = val;
}

public synchronized void setVal2(int val2) {
this.val2 = val2;
}

}

因此,正如您在前面的示例中看到的那样,我在 ClassOne.setClassTwo 和 ClassTwo.setVal 以及 ClassTwo.setVal2 上进行同步。我想知道的是,如果我删除 ClassTwo.setVal 和 ClassTwo.setVal2 上的同步,性能是否完全相同,如下所示:

public class ClassTwo {

private int val;
private int val2;

public void setVal(int val) {
this.val = val;
}

public void setVal2(int val2) {
this.val2 = val2;
}

}

在这种情况下它们在功能上是等价的(假设没有其他类正在使用这些类),但想知道有多少开销(如果有的话)有更多的同步。

最佳答案

会不会有开销?是的。

开销会很大吗?视情况而定。
如果只有一个线程,那么即使在 these ancient times 中,答案也是“否”无竞争的同步速度很快,据说自那以后他们让它变得更好。

那么如果有超过 1 个线程会怎样?那么问题来了:您发布的 2 个版本在功能上是等效的。为什么?因为你调用的子方法是公共(public)类的公共(public)方法。因此,它们可以在您的 setClassTwo 之外调用,因此 - 没有同步。

另一件需要注意的事情是它们在不同的显示器上同步。第二个版本仅在 1 个显示器上同步,而原始版本在两个显示器上同步。

长话短说

synchronized 留在需要同步的方法上,不要只期望调用者同步(除非它嵌入在类 API 中)。如果调用方法正确地进行了同步,就不会有争用并且开销会非常小,如果它们无法以某种方式做到这一点(例如,通过某人直接调用你的方法),那么你就会出现争用和更大的开销 -但是你仍然有线程安全。

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

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