25
Многопоточность в Java: основы Алексей Владыкин 17 ноября 2014 Алексей Владыкин Многопоточность (1) 17 ноября 2014 1 / 24

Java, осень 2014: Многопоточность в Java: основы

Embed Size (px)

DESCRIPTION

Общие сведения о параллелизме. Запуск и остановка потоков. Синхронизация потоков: synchronized, wait, notify. Модель памяти. Ключевое слово volatile.

Citation preview

Page 1: Java, осень 2014: Многопоточность в Java: основы

Многопоточность в Java: основы

Алексей Владыкин

17 ноября 2014

Алексей Владыкин Многопоточность (1) 17 ноября 2014 1 / 24

Page 2: Java, осень 2014: Многопоточность в Java: основы

1 Общие сведения о параллелизме

2 Управление потоками

3 Синхронизация потоков

4 Модель памяти

Алексей Владыкин Многопоточность (1) 17 ноября 2014 2 / 24

Page 3: Java, осень 2014: Многопоточность в Java: основы

Общие сведения о параллелизме

Алексей Владыкин Многопоточность (1) 17 ноября 2014 3 / 24

Page 4: Java, осень 2014: Многопоточность в Java: основы

Общие сведения о параллелизме

Мотивация

Одновременное выполнение нескольких действий(например, отрисовка пользовательского интерфейса и передачафайлов по сети)

Ускорение вычислений(при наличии нескольких вычислительных ядер)

Алексей Владыкин Многопоточность (1) 17 ноября 2014 4 / 24

Page 5: Java, осень 2014: Многопоточность в Java: основы

Общие сведения о параллелизме

Закон Амдала

S(N) =1

(1− P) + PN

S — ускорение (speedup)P — доля вычислений, которые возможно распараллелитьN — количество вычислительных ядер

Алексей Владыкин Многопоточность (1) 17 ноября 2014 5 / 24

Page 6: Java, осень 2014: Многопоточность в Java: основы

Общие сведения о параллелизме

Параллелизм в Java

Запуск нескольких JVM на одном или на разных компьютерахНет общей памятиВзаимодействие через файловую систему или сетевое соединение

Запуск нескольких потоков внутри JVMЕсть общая памятьОбширная поддержка в языке и стандартной библиотеке

Алексей Владыкин Многопоточность (1) 17 ноября 2014 6 / 24

Page 7: Java, осень 2014: Многопоточность в Java: основы

Общие сведения о параллелизме

Параллелизм в Java

Запуск нескольких JVM на одном или на разных компьютерахНет общей памятиВзаимодействие через файловую систему или сетевое соединение

Запуск нескольких потоков внутри JVMЕсть общая памятьОбширная поддержка в языке и стандартной библиотеке

Алексей Владыкин Многопоточность (1) 17 ноября 2014 6 / 24

Page 8: Java, осень 2014: Многопоточность в Java: основы

Общие сведения о параллелизме

Проблемы параллельных программ

Гонка (race condition)

Взаимная блокировка (deadlock)

Алексей Владыкин Многопоточность (1) 17 ноября 2014 7 / 24

Page 9: Java, осень 2014: Многопоточность в Java: основы

Управление потоками

Алексей Владыкин Многопоточность (1) 17 ноября 2014 8 / 24

Page 10: Java, осень 2014: Многопоточность в Java: основы

Управление потоками

java.lang.Thread

Потоки представлены экземплярами класса java.lang.Thread

String getName()

long getId()

boolean isDaemon()

StackTraceElement[] getStackTrace()

ThreadGroup getThreadGroup()

Алексей Владыкин Многопоточность (1) 17 ноября 2014 9 / 24

Page 11: Java, осень 2014: Многопоточность в Java: основы

Управление потоками

Thread dump

Список всех потоков с их состояниями и stack trace’ами

Ctrl+Break или Ctrl+\

jps -l, затем jstack PID

Кнопка в IDE

Алексей Владыкин Многопоточность (1) 17 ноября 2014 10 / 24

Page 12: Java, осень 2014: Многопоточность в Java: основы

Управление потоками

Создание потока: подкласс Thread

Thread thread = new Thread () {

@Overridepublic void run() {

// do some work}

}

Алексей Владыкин Многопоточность (1) 17 ноября 2014 11 / 24

Page 13: Java, осень 2014: Многопоточность в Java: основы

Управление потоками

Создание потока: Runnable

Runnable runnable = new Runnable () {

@Overridepublic void run() {

// do some work}

};

Thread thread = new Thread(runnable );

Алексей Владыкин Многопоточность (1) 17 ноября 2014 12 / 24

Page 14: Java, осень 2014: Многопоточность в Java: основы

Управление потоками

Жизненный цикл потока

Создание объекта Thread

Запускthread.start()

Работавыполняется метод run(), thread.isAlive() == true

Завершениеметод run() закончился или бросил исключение

Завершенный поток нельзя перезапустить

Алексей Владыкин Многопоточность (1) 17 ноября 2014 13 / 24

Page 15: Java, осень 2014: Многопоточность в Java: основы

Управление потоками

Прерывание потока

thread.interrupt()

Если поток находится в ожидании (sleep, join, wait), тоожидание прерывается исключением InterruptedException

Иначе у потока просто устанавливается флаг interruptedфлаг проверяется методами interrupted() и isInterrupted()проверять флаг и завершать поток надо самостоятельно

thread.join()

Алексей Владыкин Многопоточность (1) 17 ноября 2014 14 / 24

Page 16: Java, осень 2014: Многопоточность в Java: основы

Синхронизация потоков

Алексей Владыкин Многопоточность (1) 17 ноября 2014 15 / 24

Page 17: Java, осень 2014: Многопоточность в Java: основы

Синхронизация потоков

Возможности встроенной синхронизации

Взаимное исключение(пока один поток что-то делает, другие не могут ему помешать)

Ожидание и уведомление(поток ожидает уведомлений от других потоков)

Алексей Владыкин Многопоточность (1) 17 ноября 2014 16 / 24

Page 18: Java, осень 2014: Многопоточность в Java: основы

Синхронизация потоков

Ключевое слово synchronized

Синхронизованный метод

public synchronized void doSomething () {// ...

}

Синхронизованный блок внутри метода

public void doSomething () {synchronized (obj) {

// ...}

}

Алексей Владыкин Многопоточность (1) 17 ноября 2014 17 / 24

Page 19: Java, осень 2014: Многопоточность в Java: основы

Синхронизация потоков

Ключевое слово synchronized

Синхронизация блоков — по монитору указанного объекта

Синхронизация методов — по монитору текущего объекта (this)

Синхронизация статических методов — по монитору класса

Алексей Владыкин Многопоточность (1) 17 ноября 2014 18 / 24

Page 20: Java, осень 2014: Многопоточность в Java: основы

Синхронизация потоков

Ожидание и уведомления

Допустимо только внутри synchronized

void wait()void wait(long millis)void wait(long millis, int nanos)

void notify()void notifyAll()

Алексей Владыкин Многопоточность (1) 17 ноября 2014 19 / 24

Page 21: Java, осень 2014: Многопоточность в Java: основы

Модель памяти

Алексей Владыкин Многопоточность (1) 17 ноября 2014 20 / 24

Page 22: Java, осень 2014: Многопоточность в Java: основы

Модель памяти

Атомарность

Чтение и запись полей всех типов, кроме long и double,происходит атомарно

Если поле объявлено с модификатором volatile, то атомарночитаются и пишутся даже long и double

Алексей Владыкин Многопоточность (1) 17 ноября 2014 21 / 24

Page 23: Java, осень 2014: Многопоточность в Java: основы

Модель памяти

Видимость

Изменения значений полей, сделанные одним потоком, могутбыть не видны в другом потоке

Изменения, сделанные одним потоком, могут быть видны вдругом потоке в ином порядке

Правила формализованы при помощи отношения happens-before

Семантика final

Алексей Владыкин Многопоточность (1) 17 ноября 2014 22 / 24

Page 24: Java, осень 2014: Многопоточность в Java: основы

Модель памяти

happens-before

Запись volatile-поля happens-before чтения этого поля

Освобождение монитора happens-before захват того жемонитора

thread.start() happens-before thread.run()

Завершение thread.run() happens-before выход изthread.join()

. . .

Алексей Владыкин Многопоточность (1) 17 ноября 2014 23 / 24

Page 25: Java, осень 2014: Многопоточность в Java: основы

Что сегодня узнали

Какие бывают виды параллелизма и как они поддерживаются вJava

Как в Java запускать и останавливать потоки

Какие в Java есть встроенные в язык средства синхронизациипотоков

Что такое Java Memory Model

Алексей Владыкин Многопоточность (1) 17 ноября 2014 24 / 24