我知道之前有几次被问到这个问题:
Synchronizing elements in an array
但我找不到我的问题的答案:当我有一个包含多个元素的数组时,我的线程将同时修改这些元素 (否则没有优势使用线程,对吧?)我使用我的数组作为一个锁(这是有道理的,因为它是由于时间切片可能会进入不一致状态的关键数据)然后我对阵列的操作是安全的但是所有的并行化会丢失,不是吗?!
我添加了一些我想尝试的代码:
import java.util.Arrays;
public class ParallelNine extends Thread{
public static final int[] input = new int[]{
119_119_119,
119_119_119,
111_111_111,
999_999_999,
};
private static int completed = 0;
static void process(int currentIndex){
System.out.println("Processing " + currentIndex);
String number = Integer.toString(input[currentIndex]);
int counter = 0;
for(int index = 0; index < number.length(); index++){
if(number.charAt(index) == '9')
counter++;
}
input[currentIndex] = counter;
}
@Override public void run(){
while(completed < input.length){
synchronized(input){
process(completed);
completed++;
}
}
}
public static void main(final String... args) throws InterruptedException{
Thread[] threads = new Thread[]{new ParallelNine(), new ParallelNine(), new ParallelNine(), new ParallelNine()};
for(final Thread next : threads){
next.run();
}
for(final Thread next : threads)
next.join();
System.out.println(Arrays.toString(input));
}
}
我们有一个带有原始int值的数组。专用方法(进程)计算数字9出现在数组索引处的整数值中的频率,然后用计数的9个数字覆盖已检查的数组元素。所以正确的输出将是[3, 3, 0, 9]
。这个数组(输入)非常小但是如果我们有几千个条目,那么让多个线程计算9个是有意义的:所以我在数组上同步但是如上所述上面:所有的并行化都会丢失,因为一次只有一个线程可以访问数组!