Concurrency

Проработать

  1. Конкурентность: Параллелизм
  2. Concurrency Vs Parallelism!
  3. undefined Мютекс и монитор
  4. Синхронизированный метод и блок в Java (synchronized method vs block)
  5. Синхронизация потоков, блокировка объекта и блокировка класса
  6. Java Lock API. Теория и пример использования
  7. 10 советов по многопоточному программированию на Java
  8. Многопоточность в Java
  9. Синхронизация потоков
  10. А как же всё-таки работает многопоточность? Часть I: синхронизация
  11. Обзор java.util.concurrent.*
  12. Управление потоками. Ключевое слово volatile и метод yield()
  13. Что такое монитор, мьютекс и семафор? Это одно и тоже или разные вещи?
  14. 5 вещей, которых вы не знали о многопоточности
  15. Синхронизация потоков
  16. Виталий Аксенов — Введение в параллельное программирование
  17. Многопоточность в Java: ExecutorService
  18. Параллельность в Java на практике
  19. Concurrency vs Parallelism
  20. Java Concurrency in Practice, глава 1 — Книжный клуб .rar
  21. Multithreading in Java Explained in 10 Minutes
  22. Потоки в Java: От рождения до смерти. Введение в многопоточность
  23. Мастерство многопоточности: Превращаем Java в шедевр параллельного программирования
  24. Неблокирующая синхронизация - Concurrency #2 - Advanced Java
  25. Сервис запуска потоков - Concurrency #3 - Advanced Java
  26. Синхронизаторы - Concurrency #4 - Advanced Java
  27. ThreadLocal - Concurrency #5 - Advanced Java
  28. Дмитрий Чуйко — Новинки в java.util.concurrent
  29. Глеб Смирнов — Расчленяя многопоточность
  30. Многопоточность без боли: моя шпаргалка для собесов в Java
  31. Три модели многопоточности
  32. Введение в многопоточность в Java очень простым языком: Процессы, Потоки и Основы синхронизации
  33. Java 8 в параллель. Учимся создавать подзадачи и контролировать их выполнение
  34. Тестовое задание Java Многопоточность
  35. Глеб Смирнов — Многопоточность Java под капотом
  36. Как сделать параллельные транзакции
  37. Deadlock

  38. Как устроить Deadlock, а затем уйти от взаимной блокировки навсегда
  39. Deadlock - Concurrency #1 - Advanced Java
  40. Java. Многопоточность. Как устроить Deadlock

Основные разделы

Процесс(Process)

Процесс(Process) - единица операционной системы. На которую выделена память и др. ресурсы. Содержит в себе потоки. Процесс в Java — это JVM. Запуская Java-программу, вы запускаете процесс: java MyProgram.

Поток(Thread)

Поток(Thread) - единица исполнения кода.

Поток имеет stack и memory для исполнения. Потоки исполняются на ядрах процессора. Чаще всего одна программа состоит из одного процесса, но бывают и исключения (например, браузер Chrome создает отдельный процесс для каждой вкладки, что дает ему некоторые преимущества, вроде независимости вкладок друг от друга). Процессы изолированы друг от друга, поэтому прямой доступ к памяти чужого процесса невозможен (взаимодействие между процессами осуществляется с помощью специальных средств).

Приложение живо пока жив хоть один поток.

Главный поток(main thread) запускает метод main, и всё выполнение программы начинается с него.

Для чего используют многопоточность

  1. Параллельное выполнение задач, которые можно выполнять одновременно.
  2. Задачи, зависящие от ожидания (I/O-bound).
  3. Вычислительно сложные задачи (CPU-bound).
  4. Обработка событий и интерфейсов.
  5. Реализация фоновых задач.

Атомарный

Атомарный - значит "неделимый" - в том смысле, что операция должна быть выполнена полностью или отменена.

Критическая секция

Критическая секция - участок исполняемого кода программы, в котором производится доступ к общему ресурсу (данным или устройству), который не должен быть одновременно использован более чем одним потоком выполнения. При нахождении в критической секции двух (или более) потоков возникает состояние «гонки» («состязания»). Во избежание данной ситуации необходимо выполнение четырех условий:

Способы создания потоков

  1. Создать класс с реализацией Runnable, его объект передать его в конструктор класса Thread и вызвать метод start(). Этот интерфейс содержит один метод run(), который будет выполняться в новом потоке. Поток закончит выполнение, когда завершится его метод run().
  2. Наследоваться от класса Thread и переопределить его метод run().
  3. Создать объект реализации Callable передать его в реализацию ExecutorService.

Основные недостатки многопоточности