gpt4 book ai didi

Java并发-线程未完成循环

转载 作者:行者123 更新时间:2023-12-02 01:43:47 27 4
gpt4 key购买 nike

我正在学习 Java 并发基础知识,但在下面的示例中遇到了一个问题。有两个线程应该同时运行并完成处理某个全局静态对象的循环。我预计一个线程可以在另一个线程之前完成并打印不同的值,但我没想到会看到两个线程打印相同的值,这表明它们在打印输出之前都没有完成循环。

代码:

public class TestThreads {
public static void main(String[] args) {
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
Thread one = new Thread(t1);
Thread two = new Thread(t2);
one.start();
two.start();
}
}

class Accum {
private static Accum a = new Accum();
private int counter = 0;
private Accum() {

}
public static Accum getAccum() {
return a;
}
public int getCount() {
return counter;
}
public void updateCounter(int add) {
counter += add;
}
}

class ThreadOne implements Runnable {
Accum a = Accum.getAccum();
public void run() {
for(int x=0; x < 98; x++) {
a.updateCounter(1000);
try {
Thread.sleep(50);
} catch(InterruptedException ex) { }
//System.out.println("index in one = " + x);
}
System.out.println("one " + a.getCount());
}
}

class ThreadTwo implements Runnable {
Accum a = Accum.getAccum();
public void run() {
for(int x=0; x < 99; x++) {
a.updateCounter(1);
try {
Thread.sleep(50);
} catch(InterruptedException ex) { }
//System.out.println("index in two = " + x);
}
System.out.println("two " + a.getCount());
}
}

为什么会发生这种情况?当我尝试使用 print 语句进行调试(在上面的代码中注释)时,一切都开始按预期工作。

我的输出:(每次都不一样,这也很奇怪)

one 82067 two 82067

这实际上是《Head First Java》(第二版)一书中的代码难题,但作者提供了与上面相同的代码作为不同行为的解决方案。

书籍输出:(与上面相同的代码)

one 98098 two 98099

书籍说明:

Threads from two different classes are updating the same object in a third class, because both threads are accessing a single instance of Accum.

总而言之,我的问题是:

  1. 为什么我的代码每次的输出都不同?
  2. 为什么线程中的循环没有完成其工作?
  3. 为什么我的输出与书中提供的不同?**

** - 附加

最佳答案

不知道这本书期望它如何工作,但是您的 Accum 实例不是线程安全的。因此,每次运行它时,您都会得到不同的答案。如果你使 updateCounter() 和 getCount() 同步,它应该可靠地工作。

关于Java并发-线程未完成循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54023848/

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