При этом ускорение программы с помощью многопоточных вычислений на нескольких процессорах ограничено размером последовательной части программы. Это так называемый закон Амдала.
Этот закон гласит следующее — В случае, когда задача разделяется на несколько частей, суммарное время её выполнения на параллельной системе не может быть меньше времени выполнения самого длинного фрагмента.
Согласно этому закону, ускорение выполнения программы за счёт распараллеливания её инструкций на множестве вычислителей, ограничено временем, необходимым для выполнения её последовательных инструкций.
ускорение программы с помощью многопоточных вычислений на нескольких процессорах ограничено размером последовательной части программы. Это так называемый закон Амдала.
Это гибкость также может создать и проблему.
Этот класс добавляет дополнительную опцию справедливости
как в Java 64-битные long и double значения рассматриваются как два 32-битных значения.
Это означает, что 64-разрядная операция записи выполняется как две отдельные 32-разрядные операции.
И это значит, что действия с long и double переменными не являются потокобезопасными.
Когда несколько потоков получают доступ к long или double значению без синхронизации, это может вызвать проблемы.
Атомарное действие не может остановиться посередине: оно либо происходит полностью, либо вообще не происходит.
Никакие промежуточные результаты атомарного действия не видны, пока действие не будет завершено.
Еще раз, если два нестатических метода класса объявлены как synchronized, то в каждый момент времени из разных потоков на одном объекте может быть вызван только один из них.
Ключевое слово synchronized в Java обеспечивает:
Либо JVM, либо операционная система базовой платформы определяют, как распределять ресурс процессора среди потоков — задача, известная как планирование потоков.
Эта часть JVM или операционной системы, которая выполняет планирование потоков, является планировщиком потоков
Если процессор одноядерный, и так как несколько потока выполняются у нас одновременно, то нужно создать для пользователя, эту самую одновременность выполнения.
Операционная система, делает это хитро, за счет переключения между выполнением этих потоков (эти переключения мгновенны и время идет в миллисекундах).
То есть, система некоторое время выполняет один поток, затем резко переключается на выполнение другого потока, и так далее по кругу.
Таким образом, создается впечатление одновременного выполнения нескольких задач.
Но при этом теряется производительность.
Если процессор многоядерный, тогда переключения может не потребоваться.
Система будет посылать каждый поток на отдельное ядро.
Несколько потоков могут выполняться одновременно, каждый на своем ядре.
Но тут есть проблема.
Для использования преимуществ многоядерности, код программы должен быть оптимизирован для выполнения на многоядерных процессорах.
Это означает, что программа, или процесс, должна быть максимально распараллелена в коде по отдельным задачам