【发布时间】:2019-05-08 11:11:29
【问题描述】:
我正在尝试同时运行 n 个线程。每个线程应该对不同的数组求和并更新全局值。
很遗憾,全局值更新不正确。
我不想使用 thread.join()。
这是我目前的代码:
public class myClass {
private static class Values {
private static double sum;
public synchronized static void add(double dd) {
sum += dd;
};
public synchronized double get() {
return sum;
}
}
public static double CreateThreads(double[] array) {
final Values values = new Values();
...
...
...
Thread[] threads = new Thread[nOP];
for (int i = 0; i<threads.length; i++) {
threads[i] = new Thread(new Runnable() {
public void run() {
Values.add(sum(tab));
}
});
threads[i].start();
}
return values.get();
}
public static void main(String[] args) throws IOException {
double[] arr = createArray(4);
double sumLogg = CreateThreads(arr);
System.out.println("\n\nSum: " + sumLogg);
}
有什么想法吗?
【问题讨论】:
-
嗯,我刚刚注意到你不想使用
.join(),这是为什么呢? -
除了你得到的答案:你没有在同一个锁上同步读取和写入:一个在 Values.class 上同步,一个在 Values 中创建的实例上同步CreateThreads 方法(违反命名约定,顺便说一句)。如果您不了解静态字段和实例字段之间的区别,则应该在使用线程之前了解这一点。
-
Values.get 也应该是静态的。但是您正在创建 Values 类的实例。 @ruan 要么全部静态化,要么全部使用单个实例。
-
您不想使用
join,那么您必须使用其他方式等待线程完成(例如CountDownLatch,Semaphore,ForkJoinTask,... ) .你现在做的方式可能是在任何线程有机会运行之前读取结果。为什么sum和add()是静态的?
标签: java multithreading java-threads