Презентация - Java - многопоточность v3.pptx
- Количество слайдов: 23
Разработка многопоточных приложений на Java Потоки/Память/Утилиты Рексофт: Инновации на заказ 1 Рексофт, 2013
Содержание § Общие сведения § Управление потоками § Синхронизация потоков § Модель памяти § JVM и виды памяти § Практические примеры 2 Рексофт, 2013
Общие сведения: Параллелизм Зачем § § § Одновременное выполнение нескольких действий (например, «отрисовка» пользовательского интерфейса и передача файлов по сети) Ускорение вычислений (при наличии нескольких вычислительных ядер) Как § § § 3 Запуск нескольких JVM на одном или на разных компьютерах § Нет общей памяти § Взаимодействие через файловую систему или сетевое соединение Запуск нескольких потоков внутри JVM § Есть общая память § Обширная поддержка в стандартной библиотеке Рексофт, 2013
Общие сведения: Многопоточность обеспечивает параллельное выполнение задач в рамках одной виртуальной машины. Чем отличается поток от процесса? § Поток – программа (последовательность операций), выполняющаяся на процессоре. § Процесс – контейнер для потоков, группирующий для них ресурсы системы (адресное пространство, потоки ввода/вывода и др. ) Процессы изолированы друг от друга, в то время как потоки разделяют общие ресурсы. В однопоточном приложении процесс (JVM) содержит один поток, в то время как в многопоточном их может быть много в рамках одного процесса. 4 Рексофт, 2013
Общие сведения: Типы потоков Существует 2 типа потоков (threads): 1. Native threads – потоки, поддерживаемые на уровне операционной системы, которая контролирует их жизненный цикл и их выполнение. Поддерживаются большинством современных ОС. 2. Green threads – имитация потоков, появившаяся в первых версиях Java. Работают в рамках одного потока ОС. JVM отвечает за переключение таких потоков. § § 5 Преимущества: более быстрое переключение между потоками, быстрое порождение нового потока. Недостатки: невозможно параллельное выполнение в мультипроцессорной/мультиядерной архитектуре из-за использования одного потока ОС. Рексофт, 2013
Общие сведения: Проблемы параллельных программ Взаимная блокировка (deadlock) § Ситуация в многозадачной среде, при которой несколько процессов находятся в состоянии бесконечного ожидания ресурсов, занятых самими этими процессами Гонка (race condition) § Ошибка программирования многозадачной системы, при которой работа системы зависит от того, в каком порядке выполняются части кода. 6 Рексофт, 2013
Управление потоками: класс java. lang. Thread Поток в Java представлен классом java. lang. Thread, экземпляры которого являются обычными java объектами. § Запущенный объект Thread создает новый поток. § Один поток = Один стек вызовов (call stack) § При любом запуске JVM создается, как минимум, один поток (соответствующий функции main). Методы класса java. lang. Thread § String get. Name() § Long get. Id() § Int get. Priority() § Boolean is. Daemon() § Stack. Trace. Element[] get. Stack. Trace() § Thread. Group get. Thread. Group() 7 Рексофт, 2013
Управление потоками: Создание потока Thread vs. Runnable Java поток может быть описан двумя способами: § Наследованием от класса java. lang. Thread; § Реализацией интерфейса Runnable. 8 Рексофт, 2013
Управление потоками: Работа потоков (часть 1) Каков будет результат выполнения? Ответ: Последовательность вывода данных потоков может быть любая. Гарантируется лишь , что каждый отдельный поток будет выполнять инструкции в указанном в коде порядке. 9 Рексофт, 2013
Управление потоками: Работа потоков (часть 2) Планировщик потоков – является частью JVM и принимает решение, какой поток будет выполняться в каждый конкретный момент. В каждый момент времени только один поток может выполняться на одном процессоре. Планировщик переводит поток из состояния runnable ( «готовый выполняться» ) в состояние running ( «выполняется» ). Формально, не существует никакого гарантированного порядка, в котором планировщик будет разрешать потокам выполняться. Также не гарантируется, что поток будет непрерывно выполняться в течении какого-либо предсказуемого промежутка времени. Разработчик не может управлять планировщиком потоков, реализация которого специфична для каждой JVM. § § § 10 Рексофт, 2013
Управление потоками: Работа потоков (часть 3) Однако, существует набор методов, позволяющих влиять на решения планировщика. Методы класса Thread: § public static void sleep(long millis) throws Interrupted. Exception* § public static void yield() § public final void join() throws Interrupted. Exception* § public final void set. Priority(int new. Priority) § public void interrupt() Методы класса Object: § public final void wait() throws Interrupted. Exception* § public final void notify() § public final void notify. All() * - данные методы имеют перегруженные варианты 11 Рексофт, 2013
Управление потоками: Состояния потоков New - состояние, когда экземпляр Thread уже создан, но ещё не был запущен. Runnable – состояние, когда поток готов выполняться, но в текущий момент времени планировщик не выбрал его на выполнение. Running – состояние, когда поток выполняется, т. е. планировщик выбрал его на выполнение. В это состояние возможно попасть только из состояния Runnable и по решению планировщика. Из этого состояния поток может выйти как самостоятельно, так и по решению планировщика. Waiting/Blocked/Sleeping – состояния, в которых поток не может выполняться, однако, может вернуться в состояние Runnable § § § § Waiting – поток ожидает нотификация от другого потока; Blocked – поток заблокирован в ожидании ресурса (ввода/вывода, блокировки на объект и др. ); Sleeping – поток перешел в режим сна на фиксированный период времени. Dead – состояние, в которое переходит поток после завершения выполнения метода run(). Из данного состояния поток не может перейти ни в какое другое. § 12 Рексофт, 2013
Управление потоками: Возможности встроенной синхронизации и взаимодействия потоков Взаимное исключение (пока один поток что-то делает, другие не могут ему помешать) § § Ключевое слово synchronized указывает, что метод или его часть является атомарной (неделимой, синхронизованной) операцией. В каждый момент времени только один поток может выполнять данный участок кода для данного объекта. При этом поток должен выполнить метод до конца, чтобы дать другому потоку возможность его выполнить. Ожидание и уведомление (поток ожидает, когда будет выполнено некоторое условие, периодически получая уведомления от других потоков) § § 13 Для взаимодействия потоков между собой существует 3 метода класса Object: § wait() - переводит поток в состояние waiting и ожидание нотификации от другого потока для возвращения в состояние runnable; § notify() - нотифицирует другой поток, находящийся в состоянии waiting для этого же объекта; § notify. All() – нотифицирует все потоки, находящиеся в состоянии waiting для этого же объекта. Рексофт, 2013
Модель памяти Java Memory Model (JMM, модель памяти Java) – часть спецификации языка java, описывающая работу Java потоков с памятью. Кроссплатформенность java требует независимости от какой-либо архитектуры, но при этом требуется иметь максимально полную и непротиворечивую модель работы с памятью. JMM регулирует следующие характеристики работы приложения с памятью: 1. Атомарность 2. Видимость изменений В настоящей версии JMM данный набор правил определяет, при каких условиях один поток видит изменения, произведенные другими потоками. 3. Упорядоченность операций Изменение порядка исполнения операций в коде может быть следствием одной из многочисленных оптимизаций, производимых: § компилятором java; § JIT компилятором; § процессором. В результате может получиться так, что действия выполненные одним потоком, другой поток увидит в другом порядке. 14 Рексофт, 2013
Модель памяти: happens-before § Освобождение блокировки happens-before получения той же блокировки § Все действия, выполненные потоком, happens-before успешного завершения join на этом потоке. § Запись в volatile переменную happens-before чтения из той же самой переменной. § Запись значения в final-поле (и, если это поле — ссылка, то ещё и всех переменных, достижимых из этого поля - dereference-chain) при конструировании объекта happens-before записи этого объекта в какую-либо переменную, происходящей вне этого конструктора. 15 Рексофт, 2013
JDK concurrency utilities Со временем стало ясно, что описанные механизмы достаточно низкоуровневые. Приходится строить схожие утилитарные механизмы для удобной работы в многопоточной среде. В JDK 5 появился package java. util. concurrent – содержащий набор полезных утилитарных функциональностей для работы многопоточных приложений: § -Готовые реализации пулов потоков; § -Атомарные оберточные типы, гарантирующие безопасность своих операций; § -Framework для периодического асинхронного запуска задач по расписанию; § -Различные типы блокировок; § -Конкурентные расширения для коллекций; § -И многое другое… Данное API максимально оптимизировано в части производительности и надежности. Нет необходимости изобретать что-то свое. 16 Рексофт, 2013
JVM и виды памяти: Как JVM использует память Heap – для хранения Java-объектов § § Eden Space: область, в которой размещается большинство вновь созданных объектов. Survivor Space: область, которая содержит объекты, которые "выжили" после очистки мусора в области Eden Space. Tenured (Old) Generation: содержит объекты, которые существовали некоторое время в Survivor Space. Non-Heap – для хранения Java-классов, их методов и т. д. § § § 17 Permanent Generation (PG): содержит все рефлексивные данные, такие как классы и методы. Эта область делится на два типа участков: только для чтения (read-only) и с возможность как чтения, так и записи (read-write). Code Cache : предназначен для компиляции и хранения "родного" (native) кода. Рексофт, 2013
JVM и виды памяти: Garbage Collector Спецификация виртуальной машины не содержит каких-либо требований к механизму управления памятью (кроме того, что «память очищается автоматически с помощью механизма сборки мусора» ). Cборщики мусора в виртуальной машине Hotspot JVM относятся к типу сборщиков мусора, основанных на поколениях (generational garbage collectors). При использовании таких сборщиков вся память делится на области, называемые поколениями (generations): § Young Generation § Old Generation § Permanent Generation Стратегия stop-the-world! 18 Рексофт, 2013
JVM и виды памяти: Как задавать размер Heap и PG Размер Heap можно задать двумя параметрами JVM: § -Xms определяем исходный/минимальный размер heap § -Xmx определяем максимальный размер heap Размер PG можно задать двумя параметрами JVM: § -XX: Perm. Size – задаёт минимальный, или изначальный, размер PG § -XX: Max. Perm. Size – задаёт максимальный размер. 19 Рексофт, 2013
Практические примеры: Monitoring and Management Tools jconsole - Java Monitoring and Management Console - JMX-compliant graphical tool for monitoring a Java virtual machine. It can monitor both local and remote JVMs. jps - JVM Process Status Tool - Lists instrumented Hot. Spot Java virtual machines on a target system. jstat - JVM Statistics Monitoring Tool - Attaches to an instrumented Hot. Spot Java virtual machine and collects and logs performance statistics as specified by the command line options. jstatd - JVM jstat Daemon - Launches an RMI server application that monitors for the creation and termination of instrumented Hot. Spot Java virtual machines and provides a interface to allow remote monitoring tools to attach to Java virtual machines running on the local system. § § 20 Рексофт, 2013
Практические примеры: Troubleshooting Tools jinfo - Configuration Info for Java - Prints configuration information for a given process or core file or a remote debug server. jmap - Memory Map for Java - Prints shared object memory maps or heap memory details of a given process or core file or a remote debug server. jsadebugd - Serviceability Agent Debug Daemon for Java - Attaches to a process or core file and acts as a debug server. jstack - Stack Trace for Java - Prints a stack trace of threads for a given process or core file or remote debug server. § § 21 Рексофт, 2013
Практические примеры: jstatistics 22 Рексофт, 2013
Спасибо за внимание! Чернобривец Ольга Технический руководитель проекта chuvikova@reksoft. com Санкт-Петербург, Россия Тел. : +7 812 325 2100 www. reksoft. com/ru 23 Рексофт, 2013
Презентация - Java - многопоточность v3.pptx