为了理解 Java 同步的工作原理,我编写了一个简单的示例程序,该程序使用四个线程计算数组的总和。我知道它不是很有效,但似乎它应该可以工作,因为我使用了锁:
public class ConcurrencyTest1 {
static Object lock = new Object();
static volatile int sum;
public static void main(String[] args) {
int[] array = new int[40000];
Arrays.fill(array, 1);
sum = 0;
new Thread( ()-> {
for (int i=0;i<10000;++i)
synchronized(lock) {
sum += array[i];
}
} ).start();
new Thread( ()-> {
for (int i=10000;i<20000;++i)
synchronized(lock) {
sum += array[i];
}
} ).start();
new Thread( ()-> {
for (int i=20000;i<30000;++i)
synchronized(lock) {
sum += array[i];
}
} ).start();
for (int i=30000;i<40000;++i)
synchronized(lock) {
sum += array[i];
}
System.out.println(sum);
}
}
正确答案是40000。但是,当我多次运行它时,我经常得到更小的数字,例如37713或30000。为什么?
您的main
程序线程启动 4 个线程,然后打印 sum。它不会等待这些线程完成它们的工作。使其工作的最小更改是:
Thread t1 = new Thread(()-> {
for (int i=0;i<10000;++i)
synchronized(lock) {
sum += array[i];
}
});
...
t1.start();
....
t1.join();
...
t4.join();
System.out.println(sum);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句