Допустим, у меня есть два массива:
int[] array1 = new int[2000000];
int[] array2 = new int[2000000];
Я вставляю некоторые значения в массивы, а затем хочу добавить содержимое массива2 в массив1 следующим образом:
for(int i = 0; i < 2000000; ++i) array1[i] += array2[i];
Теперь, допустим, я хочу ускорить обработку на многопроцессорной машине, поэтому вместо простого цикла, как описано выше, я создаю два потока. Один из которых я обработал первые 1000000 элементов в массиве, другой я обработал последние 1000000 элементов в массиве. Мой основной поток ждет, пока эти два потока уведомят его о завершении, а затем продолжит использовать значения из array1 для всех важных вещей. (Обратите внимание, что два рабочих потока не могут быть прерваны и могут быть использованы повторно, но основной поток не возобновит работу, пока они оба не уведомят его об этом.)
Итак, мой вопрос: как я могу быть уверен, что основной поток увидит изменения, внесенные двумя рабочими потоками в массив? Могу ли я рассчитывать на то, что это произойдет, или мне нужно пройти какую-то специальную процедуру, чтобы убедиться, что рабочие потоки сбрасывают свои записи в массив, а основной поток отбрасывает значения своего кэшированного массива?