Синхронизация в методе java ForkJoinPool compute () - PullRequest
0 голосов
/ 26 мая 2020

in Java: Полный справочник, который мы читаем:

В общем, ForkJoinTask не должен использовать синхронизированные методы или синхронизированные блоки кода. Кроме того, обычно вы не хотите, чтобы метод compute () использовал другие типы синхронизации, такие как семафор

Почему мне следует избегать синхронизации в compute ()? Возможно ли в некоторых ситуациях использовать синхронизацию, например, семафорную или синхронизированную? Какой еще метод я должен использовать из java.util.concurrent, чтобы иметь масштабируемое количество потоков, как в ForkJoinTask и синхронизации?

Ответы [ 2 ]

3 голосов
/ 26 мая 2020

Вы можете использовать синхронизированные методы или синхронизированные блоки, если уверены, что они не будут блокироваться в течение длительного времени. Как минимум, они не должны вызывать Object.wait() и Semaphore.aquire(), потому что эти методы блокируют текущий поток на неопределенное время, и такая блокировка приводит либо к переполнению памяти, когда пул потоков пытается создать новый поток для замены заблокированных потоков, или нехватка потоков (своего рода тупик), когда нет доступных потоков и вся работа останавливается навсегда.

Это верно для всех типов пулов потоков, не только для ForkjoinPool, асинхронные задачи, не только ForkJoinTask.

2 голосов
/ 26 мая 2020

Из Javado c (выделено мной):

ForkJoinTask - это облегченная форма Future. Эффективность ForkJoinTasks проистекает из набора ограничений (которые только частично статически выполняются), отражающих их основное использование в качестве вычислительных задач для вычисления чистых функций или работы с чисто изолированными объектами . Основными механизмами координации являются fork (), который организует асинхронное выполнение, и join (), который не выполняется до тех пор, пока не будет вычислен результат задачи. В идеале вычисления должны избегать синхронизированных методов или блоков и должны минимизировать другую синхронизацию блокировок, кроме присоединения к другим задачам или использования синхронизаторов, таких как фазеры, которые рекламируются для взаимодействия с планированием вилки / присоединения .

...