Извиняюсь, значит я неверно понял идею из текста непосредственно поста. Мне кажется, она недостаточно хорошо донесена.
Что такое “многопоточность общего назначения”?
Если задача выполняется несколькими потоками, то она уже многопоточна. А forkjojnpool это инструмент для помощи в реализации одного из способов достижения потокобезопасности, а именно разделение общего для всех обработчиков состояния таким образом, чтобы оно перестало быть общим. Например разделение задачи на части. Таким образом достигается потокобезопасность без использования специальнных механизмов синхронизации. Thread confinement если будет интересно почитать подробнее.
А в данной ситуации из-за введения общей для всех потоков переменной callsCounter идея ломается.
Понятно, что в таком случае forkjoinpool, вероятно, не самый подходящий вариант. Но имеем то что имеем.
Если результатом выполнения программы является callsCounter то отказаться от него мы не можем. И даже отказ от forkjoinpool как неподходящего под задачу инструмента тут проблему тоже не решит, ведь синхронизация доступа потоков к общей переменной сделана некорректно, независимо от того, это forkjojnpool или нет.
Значит остается только верно синхронизировать работу с разделяемым состоянием.
Проблема возникает не столько из-за введения общей для всех переменной, сколько из-за её неправильного использования, так как в данной ситуации сначала происходит инкремент переменной, и только потом решение о том, стоит ли продолжать работу. Что некорректно.
Как если бы в кофейне бариста сначала готовил кофе, а потом задавался вопросом, а сколько ещё нужно.
Даже изменение очередности проверки состояния уже решает проблему. Отказываться от parallel stream нет необходимости.
Из выводов:
Parallel stream или forkJoinPool придуманы для решения задач с разделением работы на части и выполнения частей паралельно.
Введение общей переменной ломает идею, так как вводит разделяемое состояние и требует задуматься о более строгой синхронизации.
Отказ от parallel stream (или fork join pool) не решит проблему, ведь проблема не в них самих, а в том, что синхронизация доступа к разделяемому состоянию выполнена некорректно.
Интересное наблюдение. Действительно паралельные стримы дают ощущение простоты распараллеливания задач, и разработчик может забыть о том, что не все задачи можно просто так распараллеливать.
Добавлю, что описанная проблема с callsCounter это не проблема parallel Stream как такового, а проблема исполнения задач в многопоточной среде.
Вместо стримов можно взять любой другой способ распараллеливания и тоже получится некорректный результат.
Для решения проблемы необходимо писать более потокобезопасный код. В данной ситуации AtomicInteger использован несколько некорректно, может создаться впечатление что обеспечена потокобезопасность, а это не так.
Нет ничего страшного в использовании Parallel Stream, если помнить, что задачи выполняются в нескольких потоках.
Не обязательно жить в США или Европе, чтобы мыслить по другому. Сам язык во многом дискует то, как мыслить, и это мышление «по-другому» включается в моменты использования иностранного языка.
Человек, хорошо изучивший английский язык будет писать достаточно похоже на того, для кого английский язык родной. И совершенно непохоже на того, кто этот язык знает плохо.
Пробовал покупать книгу "Компьютерные сети" Олиферов, в формате epub. При попытке скачать через интерфейс в личном кабинете выводится сообщение, что в заказе нет цифровых книг. Хотя остальные купленные в электронном виде книги (независимо от того, pdf это или epub) можно скачать без проблем.
Эту книгу можно читать прямо на сайте. При этом читаемый файл нельзя сохранить, по крайней мере прямо такая возможность не предусмотрена.
Проверил электронную почту: туда файл с книгой пришёл.
Меня больше всего поражает, как некоторые люди считают, что вирус придумали медицинские корпорации, чтобы продать вакцины, и на самом деле его не существует. Вот что можно ответить на такой довод?
Угу. Человек привыкает к подобному отношению к решению задач, и как только задачки становятся сложнее, и вместо чашек с кубиками сахара надо умножать что-то более сложное, начинает совершать ошибки.
Утверждение «От перемены мест множителей произведение не меняется» относится к процессу умножения как таковому, а здесь, насколько я понимаю, автор имел в виду, что при записи решения задачи места множителей имеют значение.
Возможно, он считает, что ребёнку проще визуализировать процесс умножения, используя его подход: два кусочка сахара в каждой из пяти чашек. Сначала мы записываем решение, используя сложение, а потом — используя умножение, и раз мы не может сложить пять чашек дважды (5 + 5 = 10), значит и 5 * 2 — неправильная запись.
Не знаю, насколько это хорошо для формирования осмысленного отношения к процессу решения задачи. Наверное, в некоторых ситуациях это может лишь запутать.
Извиняюсь, значит я неверно понял идею из текста непосредственно поста. Мне кажется, она недостаточно хорошо донесена.
Что такое “многопоточность общего назначения”?
Если задача выполняется несколькими потоками, то она уже многопоточна. А forkjojnpool это инструмент для помощи в реализации одного из способов достижения потокобезопасности, а именно разделение общего для всех обработчиков состояния таким образом, чтобы оно перестало быть общим. Например разделение задачи на части. Таким образом достигается потокобезопасность без использования специальнных механизмов синхронизации. Thread confinement если будет интересно почитать подробнее.
А в данной ситуации из-за введения общей для всех потоков переменной callsCounter идея ломается.
Понятно, что в таком случае forkjoinpool, вероятно, не самый подходящий вариант. Но имеем то что имеем.
Если результатом выполнения программы является callsCounter то отказаться от него мы не можем. И даже отказ от forkjoinpool как неподходящего под задачу инструмента тут проблему тоже не решит, ведь синхронизация доступа потоков к общей переменной сделана некорректно, независимо от того, это forkjojnpool или нет.
Значит остается только верно синхронизировать работу с разделяемым состоянием.
Проблема возникает не столько из-за введения общей для всех переменной, сколько из-за её неправильного использования, так как в данной ситуации сначала происходит инкремент переменной, и только потом решение о том, стоит ли продолжать работу. Что некорректно.
Как если бы в кофейне бариста сначала готовил кофе, а потом задавался вопросом, а сколько ещё нужно.
Даже изменение очередности проверки состояния уже решает проблему. Отказываться от parallel stream нет необходимости.
Из выводов:
Parallel stream или forkJoinPool придуманы для решения задач с разделением работы на части и выполнения частей паралельно.
Введение общей переменной ломает идею, так как вводит разделяемое состояние и требует задуматься о более строгой синхронизации.
Отказ от parallel stream (или fork join pool) не решит проблему, ведь проблема не в них самих, а в том, что синхронизация доступа к разделяемому состоянию выполнена некорректно.
Это то, что я ожидал бы в таком случае от статьи.
Интересное наблюдение. Действительно паралельные стримы дают ощущение простоты распараллеливания задач, и разработчик может забыть о том, что не все задачи можно просто так распараллеливать.
Добавлю, что описанная проблема с callsCounter это не проблема parallel Stream как такового, а проблема исполнения задач в многопоточной среде.
Вместо стримов можно взять любой другой способ распараллеливания и тоже получится некорректный результат.
Для решения проблемы необходимо писать более потокобезопасный код. В данной ситуации AtomicInteger использован несколько некорректно, может создаться впечатление что обеспечена потокобезопасность, а это не так.
Нет ничего страшного в использовании Parallel Stream, если помнить, что задачи выполняются в нескольких потоках.
У покетбуков есть официальный сайт. Можно там поискать.
1) На ютубе много разнообразной политоты, которая на рутубе запрещена.
2) На ютубе много видео от иностранцев из разных стран мира.
И в ближайшем будущем это вряд ли изменится, особенно первое.
Не обязательно жить в США или Европе, чтобы мыслить по другому. Сам язык во многом дискует то, как мыслить, и это мышление «по-другому» включается в моменты использования иностранного языка.
Человек, хорошо изучивший английский язык будет писать достаточно похоже на того, для кого английский язык родной. И совершенно непохоже на того, кто этот язык знает плохо.
Любят у нас на любую критику отвечать: критикуешь - предлагай.
Но так не работает, и не обязан каждый человек предлагать «конструктивные предложения»
А понятие патриотизм искажено во многом как раз теми, кто себя патриотами называет.
Следят за количеством вакансий для системного аналитика)
В постгре тоже надо быть очень осторожным.
Пробовал покупать книгу "Компьютерные сети" Олиферов, в формате epub. При попытке скачать через интерфейс в личном кабинете выводится сообщение, что в заказе нет цифровых книг. Хотя остальные купленные в электронном виде книги (независимо от того, pdf это или epub) можно скачать без проблем.
Эту книгу можно читать прямо на сайте. При этом читаемый файл нельзя сохранить, по крайней мере прямо такая возможность не предусмотрена.
Проверил электронную почту: туда файл с книгой пришёл.
Печалит, что некоторые книги в электронном виде можно читать только на сайте.
Несмотря на то, что я привёл цитату Бредбери, я с его мнением не согласен.
Возможно, он считает, что ребёнку проще визуализировать процесс умножения, используя его подход: два кусочка сахара в каждой из пяти чашек. Сначала мы записываем решение, используя сложение, а потом — используя умножение, и раз мы не может сложить пять чашек дважды (5 + 5 = 10), значит и 5 * 2 — неправильная запись.
Не знаю, насколько это хорошо для формирования осмысленного отношения к процессу решения задачи. Наверное, в некоторых ситуациях это может лишь запутать.