Совместное использование объекта между двумя потоками и основной программой

Я новичок в Java и посещаю курс по параллельному программированию. Были поиски, но не могли получить базовые рамки. Программисты на Java, пожалуйста, помогите.

10
задан arunmoezhi 24 April 2014 в 23:15
поделиться

1 ответ

Вот очень яркий пример совместного использования массива между двумя потоками. Обычно вы видите только нули, но иногда что-то идет не так, и вы видите другие числа.

final int[] arr = new int[100];
Thread one = new Thread() {
    public void run() {
        // synchronized (arr) {
            for (int i = 0; i < arr.length * 100000; i++) {
                arr[i % arr.length]--;
            }
        // }
    }
};
Thread two = new Thread() {
    public void run() {
        // synchronized (arr) {
            for (int i = 0; i < arr.length * 100000; i++) {
                arr[i % arr.length]++;
            }
        //}
    }
};
one.start();
two.start();
one.join();
two.join();
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

Но если вы синхронизируете по arr вокруг цикла, вы всегда будете видеть все 0s в распечатке. Если вы раскомментируете синхронизированный блок, код будет работать без ошибок.

5
ответ дан 3 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: