gpt4 book ai didi

java - 为什么不同步?

转载 作者:行者123 更新时间:2023-12-01 06:53:31 25 4
gpt4 key购买 nike

关于Java同步,我尝试了一个例子(来自TLF-SOFT-VTC.java.6CFE),但结果是错误的,为什么不同步?代码:

public class InterferenceFix extends Thread {
String name;
static boolean isZero = true;
static int counter = 0;

public static void main(String arg[]) {
InterferenceFix one = new InterferenceFix("one");
InterferenceFix two = new InterferenceFix("two");
one.start();
two.start();
}

InterferenceFix(String nameString) {
name = nameString;
}

public void run() {
for (int i = 0; i < 100000; i++) {
update();
}
System.out.println(name + ": " + counter);
}

synchronized void update() {
if (isZero) {
isZero = false;
counter++;
} else {
isZero = true;
counter--;
}
}
}

最佳答案

只有您的 update 方法是同步的,这意味着循环可以在两个线程上同时运行,只有 update 本身不能。

此外 - synchronized 关键字实际上锁定了对象 this,在您的例子中,我们正在讨论 2 个不同的实例,这意味着它们锁定不同的 这个。这意味着线程不会以任何方式干扰彼此的工作,并且它们可以同时运行。

如果这确实是您想要的,您可能最好创建一个静态锁:

private static final Object lock = new lock();

并将更新(或运行)更改为:

void update() {
synchronized (lock) {
if (isZero) {
isZero = false;
counter++;
} else {
isZero = true;
counter--;
}
}
}

如果您需要同步 for 循环,只需在循环周围以相同的方式使用锁,而不是在 update 内部。

关于java - 为什么不同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18938481/

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