gpt4 book ai didi

java - 为什么这个同步方法没有按预期工作?

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

我有一个名为 MyRunnable 的类:

public class MyRunnable extends Main implements Runnable  {
String name; // name of thread
Thread t;

MyRunnable (String threadname) {
name = threadname;
t = new Thread(this, name);
t.start();
}

public void run() {
try {
for (int i=0;i<100000;i++) {
extend(1);
}
} catch (InterruptedException e) {
System.out.println("Thread interrupted.");
}
System.out.println("Thread " + name + " exiting.");
}

}

还有一个名为 Main 的类:

public class Main {
private static List<Integer> numbers=new ArrayList<>();

public synchronized void extend (int i) throws InterruptedException {
numbers.add(i);
}
public synchronized static int getSize() {
return numbers.size();
}

public static void main(String[] args) {
MyRunnable t0=new MyRunnable("0");
MyRunnable t1=new MyRunnable("1");
MyRunnable t2=new MyRunnable("2");

try {
t0.t.join();
t1.t.join();
t2.t.join();
} catch (InterruptedException e) {

}
System.out.println(getSize());
}
}

现在我期望得到 300000 作为输出,但相反我得到了一个随机数(大约在 250000 到 290000 之间),即使我确实使用了同步方法。我确实阅读了oracle的文档http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html但我似乎无法弄清楚为什么这没有按预期工作。有人可以解释一下为什么吗?

提前致谢

最佳答案

方法与调用它们的对象同步。您需要创建一个在每个对象之间共享的对象,并让它们在该对象上同步。

private static List<Integer> numbers=new ArrayList<>();
public synchronized void extend (int i) throws InterruptedException {
synchronize(numbers) {
numbers.add(i);
}
}

关于java - 为什么这个同步方法没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33509564/

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