gpt4 book ai didi

java - 我应该在我的示例中同步方法吗?

转载 作者:行者123 更新时间:2023-12-01 07:21:45 24 4
gpt4 key购买 nike

我不确定在我的示例中是否应该同步方法 methodOne() 。我认为不会,但我不是 100% 确定。您能给我一些建议吗?

public class SynchroIssue {

class Test {
private double a = 0;

void methodOne() {
a++;
}

void go() {
new Thread(new Runnable() {

@Override
public void run() {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
methodOne();
System.out.println(Thread.currentThread().getName() + ", a = " + a);
}
}
}).start();
}
}

public static void main(String... args) {
SynchroIssue mainObj = new SynchroIssue();

SynchroIssue.Test object1 = mainObj.new Test();
SynchroIssue.Test object2 = mainObj.new Test();

object1.go();
object2.go();
}
}

最佳答案

假设您实际上要同时使用 SynchroIssue 类的实例(目前您还没有这样做),那么答案是肯定的。

增量运算符不是原子的。它实际上是3条指令:

  1. 获取当前值。

  2. 加 1。

  3. 存储新值。

如果未同步,并发线程可能会重叠这些步骤,从而导致奇怪的行为。

如果您确实只对整数感兴趣,另一个选择是使用 AtomicInteger ,它具有原子递增的方法。

关于java - 我应该在我的示例中同步方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35062238/

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