CPU, Memory Models, Concurrency, Multiprocess, Multithreading и Async. Часть 18. Java.
В Java как и в большинстве языков есть возможность реализовать конкуррентные программы с помощью примитивов:
🔵 Процессы
Здесь все также как и других языках + вступают в силу все те правила о которых я рассказывал ранее когда разбирались с внутренностями ОС. Для того чтобы создавать процессы нужно использовать класс java.lang.ProcessBuilder. Так как Java является кроссплатформенной то и поведение многопроцессной программы зависит от ОС.
Пример многопроцессной программы на Java
🔵 Потоки ОС (1-1 mapping, вытесняющая многозадачность)
Основной способ ивлекать максимум из железа. Каждый поток маппится на настоящий поток ОС. В Java отсутствует GIL, поэтому при запуске на многоядерной системе получаем параллелизм.
Пример многопоточной программы на Java
🔵 Виртуальные потоки (m-n mapping, кооперативная многозадачность)
Глоток свежих идей от Java Core команды. В Java не хватало легковесных файберов, которые позволили бы экономить ресурсы и ускорить работу IO bound программ. Виртуальные потоки управляются JVM, переключение между потоками происходит если поток блокируется (IO, Syscall).
Важное замечание - так как у виртуальных потоков многозадачность кооперативная, на производительность программы влияет то как написан код. Ниже ссылка на пример демонстрирующий ситуацию когда неудачно созданный поток (бесконечный цикл) блочит всю программу (программа искусственно ограничена одним ядром и одним потоком ОС для наглядности). Как говорится, чем больше сила тем больше и ответственность.
Пример многопоточной программы c virtual threads на Java
———
На этом обзор конкуррентных примитивов в Java закончен, спасибо что читали, делитесь в комментариях опытом разработки конкуррентных программ, мне будет очень интересно почитать, так как с Java в проде не работал😊
Post #346
2.69K