Я часто читаю, що паралелізм і одночасність - це різні речі. Дуже часто відповідачі / коментатори йдуть так далеко, як пишуть, що це дві абсолютно різні речі. Але, на мій погляд, вони пов'язані, але я хотів би пояснити це.
Наприклад, якщо я перебуваю на багатоядерному процесорі і вдасться розділити обчислення на x менші обчислення (скажімо, використовуючи fork / join), кожен з яких працює у своїй власній темі, у мене буде програма, яка обидва робить паралельні обчислення (тому що нібито в будь-який момент часу кілька потоків збираються на декількох ядрах) і мають паралельне право?
Хоча якщо я просто використовую, скажімо, Java та маю справу з подіями інтерфейсу та перефарбуваннями на Dispatch Thread Event, а також запускаю єдиний створений ним потік, у мене з’явиться програма, яка є одночасною (EDT + GC thread + моя головна нитка тощо), але не паралельно.
Мені хотілося б знати, чи правильно я це розумію, і якщо паралелізм (за системою «єдиного, але багатоядерного») завжди передбачає одночасність чи ні?
Також, чи багатопотокові програми працюють на багатоядерних процесорах, але де різні потоки роблять абсолютно різні обчислення, які вважаються використаними "паралелізмом"?