在阵列

时间:2015-07-05 09:56:48

标签: java multithreading

我知道之前有几次被问到这个问题:

Java: how to synchronize array accesses and what are the limitations on what goes in a synchronized condition

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个是有意义的:所以我在数组上同步但是如上所述上面:所有的并行化都会丢失,因为一次只有一个线程可以访问数组!

0 个答案:

没有答案