Многопоточное программирование на Java Java Advanced.

Презентация:



Advertisements
Похожие презентации
Многопоточное программирование на Java Java Advanced.
Advertisements

Введение в многопоточное программирование Java Advanced
МНОГОПОТОЧНОЕ ПРОГРАММИРОВАНИЕ В JAVA Пакеты java.lang java.util.concurrent.
Параллелизм и потоки в Java For students of university Author: Oxana Dudnik.
1 Java 14. Параллельное выполнение. 2 Терминология При переводе на русский ДВА английских термина имеют одинаковое значение – поток: stream thread Thread.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Многопоточное программирование Java Advanced. 2Georgiy Korneev Краткое содержание 1.Введение 2.Классические задачи многопоточного программирования 3.Атомарные.
Модель приложений.NET. Среда платформы Win32, в которой выполняется программа, называется ее процессом. Эта среда состоит из: адресного пространства,
ПОТОКИ Начальные сведенияПОТОКИ Начальные сведения.
Ребусы Свириденковой Лизы Ученицы 6 класса «А». 10.
Новые возможности Java 5 Java Advanced. 2Georgiy KorneevJava Advanced / Новые возможности Java 5 Содержание Перечисления Метаданные Другие возможности.
Школьная форма Презентация для родительского собрания.
Типовые расчёты Растворы
POSIX Threads. Общая модель Программа Общая память Поток 1 CPU Поток 2 Поток N Потоки – наборы инструкций, исполняющиеся на CPU. Все потоки одной программы.
Michael Jackson
Урок повторения по теме: «Сила». Задание 1 Задание 2.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Лекция 6 Взаимоблокировка потоков Если имеются два потока и два объекта, подлежащих блокированию, возникает опасность возникновения взаимоблокировки каждый.
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Java SE: основные понятия Борис Кварцхава
Транксрипт:

Многопоточное программирование на Java Java Advanced

2 СПбГУ ИТМО Georgiy KorneevJava Advanced / Многопоточное программирование. Средства языка Java Содержание Потоки Блокировки (синхронизация) Мониторы и условия Модель памяти Java Примеры Заключение

Потоки Часть 1

4Georgiy KorneevJava Advanced / Многопоточное программирование на Java Создание потоков Класс Thread – поток Позволяет создавать потоки и производить операции с ними Интерфейс Runnable – сущность, которая может быть запущена public void run();

5Georgiy KorneevJava Advanced / Многопоточное программирование на Java Создание потока (Runnable) Пример кода // Создание потока Thread t = new Thread(new Runnable() { public void run() { System.out.println("Hello"); } }); // Запуск потока t.start();

6Georgiy KorneevJava Advanced / Многопоточное программирование на Java Создание потока (Thread) Не рекомендуется использовать Пример кода // Создание потока Thread t = new Thread() { public void run() { System.out.println("Hello"); } }; // Запуск потока t.start();

7Georgiy KorneevJava Advanced / Многопоточное программирование на Java Состояния потока Состояние потока возвращается методами int getState() и boolean isAlive() класса Thread getState()isAlive() NEW RUNNABLE+ BLOCKED+ WAITING+ TIMED_WAITING+ TERMINATED

8Georgiy KorneevJava Advanced / Многопоточное программирование на Java Свойства потока Основные свойства id – идентификатор потока name – имя потока priority – приоритет daemon – поток-демон Свойства потока не могут изменяться после запуска

9Georgiy KorneevJava Advanced / Многопоточное программирование на Java Взаимодействие потоков Создание потока (create) Запуск потока (start) Ожидание окончания потока (join) Прерывание потока (interrupt)

10Georgiy KorneevJava Advanced / Многопоточное программирование на Java Ожидание окончания потока Методы класса Thread join() – ожидать до завершения join(long millis) – ожидать до завершения или истечения millis миллисекунд join(long millis, long nanos) – ожидать до завершения или истечения millis миллисекунд и nanos миллисекунд Все методы ожидания кидают InterruptedExcepton

11Georgiy KorneevJava Advanced / Многопоточное программирование на Java Прерывание потока Методы класса Thread interrupt() – установить флаг прерывания isInterrupted() – проверить флаг прерывания interrupted() – проверить и сбросить флаг прерывания Методы, которые ожидают в процессе выполнения должны бросать InterruptedException

12Georgiy KorneevJava Advanced / Многопоточное программирование на Java Дополнительные методы Приостановка выполнения sleep(time) – приостановить поток на время yield() – позволить выполниться другим потокам Получение текущего потока currentThread()

Блокировки (синхронизация) Часть 2

14Georgiy KorneevJava Advanced / Многопоточное программирование на Java Общий случай Любой объект может служить блокировкой Снятие блокировки производится автоматически Синтаксис synchronized (o) { // Получение блокировки … } // Снятие блокировки

15Georgiy KorneevJava Advanced / Многопоточное программирование на Java Методы экземпляра Метод экземпляра может быть объявлен синхронизованным public synchronized int getValue() { … } Эквивалентно public int getValue() { synchronized (this) { … } }

16Georgiy KorneevJava Advanced / Многопоточное программирование на Java Производитель-потребитель (1) Класс данных class Data { private Object data; public void set(Object data) { … } public Object get() { … } }

17Georgiy KorneevJava Advanced / Многопоточное программирование на Java Производитель-потребитель (2) Установка значения public void set(Object data) { while (true) { synchronized (this) { if (data == null) { this.data = data; break; }

18Georgiy KorneevJava Advanced / Многопоточное программирование на Java Производитель-потребитель (3) Получение значения public Object get() { while (true) { synchronized (this) { if (data != null) { Object d = data; data = null; return d; }

Мониторы (условия) Часть 3

20Georgiy KorneevJava Advanced / Многопоточное программирование на Java Монитор Любой объект может быть монитором Для взаимодействия с монитором поток должен иметь блокировку на него Методы монитора wait(time?) – ожидание монитора notify() – извещение одного из ждущих потоков notifyAll() – извещение всех ждущих потоков

21Georgiy KorneevJava Advanced / Многопоточное программирование на Java Мониторы и блокировки При ожидании монитора блокировка с него снимается При извещении поток не получает управления пока не может получить блокировку обратно Псевдокод monitor.unlock() monitor.await() monitor.lock()

22Georgiy KorneevJava Advanced / Многопоточное программирование на Java Производитель-потребитель (2) Установка значения public synchronized void set(Object data) throws InterruptedException { while (data != null) wait(); this.data = data; notify(); }

23Georgiy KorneevJava Advanced / Многопоточное программирование на Java Производитель-потребитель (3) Получение значения public synchronized Object get() throws InterruptedException { while (data == null) wait(); Object d = data; data = null; notify(); return d; }

Модель памяти Java Часть 3

25Georgiy KorneevJava Advanced / Многопоточное программирование на Java Основные свойства Атомарность Видимость Упорядоченность

26Georgiy KorneevJava Advanced / Многопоточное программирование на Java Атомарность Атомарная операция выполняется как единое целое Операции над всеми типами кроме long и double являются атомарными

27Georgiy KorneevJava Advanced / Многопоточное программирование на Java Пример int a = 0; long b = 0; a = 1; b = -1; Возможные значения a 0 1 Возможные значения b 0 0xffffffff x ffffffff …

28Georgiy KorneevJava Advanced / Многопоточное программирование на Java Видимость Изменения произведенные потоком 1 видимы потоком 2 Видимость гарантируется в следующих случаях После изменений поток 1 освободил блокировку, которую захватил поток 2 После изменения поток 1 создал поток 2 Поток 2 дождался окончания потока 1 При неправильной синхронизации изменения могут быть видимы в произвольном порядке

29Georgiy KorneevJava Advanced / Многопоточное программирование на Java Пример int a = 0; int b = 0; a = 1; b = 2; Возможные значения пары а, b 0, 0 1, 0 1, 2 0, 2

30Georgiy KorneevJava Advanced / Многопоточное программирование на Java Упорядоченность Программы выполняются как если бы они были написаны последовательно С точки зрения других потоков выполнение программы может производиться в произвольном порядке

31Georgiy KorneevJava Advanced / Многопоточное программирование на Java Пример int a = 0; a = 1; a = 2; Возможные последовательност и значений а 0, 0 0, 1 0, 2 1, 2 2, 0 2, 1 …

32Georgiy KorneevJava Advanced / Многопоточное программирование на Java Volatile-переменные Операции с volatile-переменными всегда атомарны При чтение значения volatile-переменной оно всегда читается из общей памяти При записи значения volatile-переменной оно всегда записывается в общую память Если volatile-ссылка изменилась, то данные доступные по ней могли не измениться

33Georgiy KorneevJava Advanced / Многопоточное программирование на Java Пример 1 volatile List l = null; t1() { List l = new ArrayList(); l.add(new Object()); this.l = l; } Object t2() { while (l != null) { return l.get(0); }

34Georgiy KorneevJava Advanced / Многопоточное программирование на Java Пример 2 public class Singleton { public static volatile Singleton instance; public Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } return instance; }

35Georgiy KorneevJava Advanced / Многопоточное программирование на Java Выводы При отсутствии правильной синхронизации потоки могут увидеть практически что угодно

Примеры Часть 4

37Georgiy KorneevJava Advanced / Многопоточное программирование на Java Барьер public await(Barrier that) { // 0 synchronized (this) { // 1 this.generation++; // 2 this.notify(); // 3 } // 4 synchronized (that) { // 5 while (this.generation != that.generation) { // 6 that.wait(); // unlock 7, await 8, lock 9 } // 10 } // 11 }

38Georgiy KorneevJava Advanced / Многопоточное программирование на Java Диаграмма переходов для барьера

39Georgiy KorneevJava Advanced / Многопоточное программирование на Java Гарантированный deadlock public void run() { // 0 synchronized (o1) { // 1 o1.notifyAll(); // 2 synchronized (o2) { // 3 try { o2.wait(); // unlock 4, await 5, lock 6 } catch (InterruptedException e) {} } // 7 } // 8 }

40Georgiy KorneevJava Advanced / Многопоточное программирование на Java Диаграмма переходов для deadlock

Заключение Часть 6

42Georgiy KorneevJava Advanced / Многопоточное программирование на Java Выводы Программы должны быть хорошо синхронизированы Недосинхронизированные программы могут вести себя практически как угодно Пересенхронизированные программы часто страдают deadlockами

43Georgiy KorneevJava Advanced / Многопоточное программирование на Java Ссылки JLS. Threads and Locks // n/html/memory.html n/html/memory.html Threads: Doing Two or More Tasks At Once (Java Tutorial) // ial/threads/index.html ial/threads/index.html

44 СПбГУ ИТМО Georgiy KorneevJava Advanced / Многопоточное программирование. Средства языка Java Вопросы