Вопрос

Брайан Гетц написал хорошую статью о вилке в ходе http://www.ibm.com/developerworks/java/library/j-jtp03048.html. Анкет В нем он перечисляет алгоритм сортировки слияний с использованием механизма вилки-младшего, в котором он выполняет сортировку с двух сторон массива параллельно, а затем объединяет результат.

Алгоритм сортируется на двух разных секциях одного и того же массива одновременно. Почему Atomicintegerarray или какой -либо другой механизм, необходимый для поддержания видимости? Какую гарантию является то, что одна ветка увидит записи, сделанные другой, или это тонкая ошибка? В качестве продолжения, делает ли это гарантия Forkjoinscheduler Scala?

Спасибо!

Это было полезно?

Решение

Сам соединение (из -за форкжинов) требует точки синхронизации, это самая важная часть информации. Точка синхронизации гарантирует, что все случаи, которые произошли, видны после указанной точки.

Если вы посмотрите на код, вы можете увидеть, где происходит точка синхронизации. Это всего лишь один метод вызов Invokeall

public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) {
    t2.fork();
    t1.invoke();
    t2.join();
}

Здесь T2 в другой процесс разразится, T1 выполняет свою задачу, и этот вызовный поток будет ждать T2.join (). При прохождении T2. Все будут видны T1 и T2.

РЕДАКТИРОВАТЬ: Это редактирование просто для того, чтобы дать немного больше объяснения того, что я имел в виду под точкой синхронизации.

Допустим, у вас есть две переменные

int x;
volatile int y;

Каждый раз, когда вы пишете Y все записи, которые произошли до того, как вы прочитали Y, будут доступны. Например

public void doWork(){
   x = 10;
   y = 5;
}

Если другой поток читает y = 5, этот поток гарантированно Читать x = 10. Это потому, что запись в Y создает точку синхронизации, в которой все записи перед указанной точкой будут видны после записи.

С пулом vick gince of the Vokjointask создаст точку синхронизации. Теперь, если t2.fork () и t1.invoke (), присоединение T2 обеспечит, чтобы все записи, которые ранее произошли. Поскольку все предыдущие записи находятся в пределах той же структуры, это будет безопасно для видимости.

Я был бы рад объяснить дальше, если это не так ясно.

Другие советы

Просто предположение: Merge включает в себя присоединение к ветке, а соединение гарантирует видимость.

Вторая часть уверена; Я не знаю, как реализуется Merge.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top