1. Введение
Прежде чем мы представили потокобезопасность и способы ее достижения .
В этой статье мы рассмотрим локальные переменные и почему они потокобезопасны.
2. Память стека и потоки
Начнем с краткого обзора модели памяти JVM.
Прежде чем мы представили потокобезопасность и способы ее достижения .
В этой статье мы рассмотрим локальные переменные и почему они потокобезопасны.
Начнем с краткого обзора модели памяти JVM.
В этой статье мы рассмотрим конструкцию Phaser
из пакета java.util.concurrent
. Это очень похожая конструкция на CountDownLatch
, которая позволяет нам координировать выполнение потоков. По сравнению с CountDownLatch
имеет некоторые дополнительные функции.
Phaser
— это барьер, на котором динамическое количество потоков должно ждать, прежде чем продолжить выполнение. В CountDownLatch
это число нельзя настроить динамически, и его необходимо указать при создании экземпляра.
Фазер
APIPhaser позволяет
нам построить логику, в которой потоки должны ждать на барьере, прежде чем перейти к следующему шагу выполнения .
Сопрограммы являются альтернативой потокам Java, поскольку они обеспечивают способ выполнения прерываемых задач на очень высоком уровне параллелизма , но пока Project Loom не будет завершен, нам придется обратиться к поддержке библиотеки, чтобы получить ее.
В этом уроке мы рассмотрим Quasar, одну из таких библиотек, которая предлагает поддержку совместных программ.
Мы будем использовать последнюю версию Quasar, для которой требуется Java 11 или выше. Но пример приложения также будет работать с предыдущими версиями Quasar, совместимыми с Java 7 и 8.
Executor Framework в Java — это попытка отделить отправку задачи от выполнения задачи. Хотя этот подход очень хорошо абстрагирует детали выполнения задачи, иногда нам все же нужно настроить его для еще более оптимального выполнения.
В этом руководстве мы увидим, что происходит, когда пул потоков больше не может принимать задачи. Затем мы узнаем, как управлять этим краеугольным камнем, применяя соответствующие политики насыщения.
На следующей диаграмме показано, как служба исполнителя работает внутри:
В этом кратком руководстве мы рассмотрим основы семафоров и мьютексов в Java.
Семафор
Начнем с java.util.concurrent.Semaphore.
Мы можем использовать семафоры, чтобы ограничить количество одновременных потоков, обращающихся к определенному ресурсу.
В следующем примере мы реализуем простую очередь входа, чтобы ограничить количество пользователей в системе:
Когда мы работаем над многопоточными проектами, мы знаем, что если несколько потоков совместно используют объекты, которые не реализованы с учетом безопасности потоков , потоки могут вести себя неожиданно .
Многие из нас, возможно, страдали от проблем с потокобезопасностью. Итак, вопрос «Является ли этот класс потокобезопасным?» часто приходит на ум.
Приложение Java довольно часто обращается к реляционным базам данных через JDBC, а также использует многопоточность. В этом кратком руководстве мы обсудим, является ли java.sql.Connection
потокобезопасным.
java.sql.Connection
В этом руководстве мы собираемся изучить различные способы запуска потока и выполнения параллельных задач.
Это очень полезно, особенно при работе с длительными или повторяющимися операциями, которые не могут выполняться в основном потоке , или когда взаимодействие с пользовательским интерфейсом нельзя приостановить в ожидании результатов операции.
Чтобы узнать больше о деталях потоков, обязательно прочитайте наш учебник о жизненном цикле потока в Java.
Многопоточное программирование позволяет нам запускать потоки одновременно, и каждый поток может выполнять разные задачи. Таким образом, он оптимально использует ресурсы, особенно когда наш компьютер имеет несколько многоядерных процессоров или несколько процессоров.
Иногда нам нужно управлять несколькими потоками, чтобы они запускались одновременно.
В этом уроке мы сначала поймем требование, особенно значение «точно в то же время». Кроме того, мы рассмотрим, как запустить два потока одновременно в Java.