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

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

Transcript of Java, осень 2015: Многопоточность в Java: основы

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

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

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

27 ноября 2015

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

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

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

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

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

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

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

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

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

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

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

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

Мотивация

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

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

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

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

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

Закон Амдала

S(N) =1

(1− P) + PN

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

java.lang.Thread

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

String getName()

long getId()

boolean isDaemon()

StackTraceElement[] getStackTrace()

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

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

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

Thread dump

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

Ctrl+Break или Ctrl+\

jps -l, затем jstack PID

Кнопка в IDE

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

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

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

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

Thread thread = new Thread () {

@Overridepublic void run() {

// do some work}

}

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

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

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

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

Runnable runnable = new Runnable () {

@Overridepublic void run() {

// do some work}

};

Thread thread = new Thread(runnable );

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

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

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

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

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

Запускthread.start()

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

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

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

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

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

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

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

thread.interrupt()

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

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

thread.join()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

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

public void doSomething () {synchronized (obj) {

// ...}

}

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

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

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

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

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

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

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

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

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

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

Взаимное исключение

Только один поток может исполнять метод или блок,синхронизированный по данному объекту

Остальные потоки будут ждать

Можно синхронизироваться на одном объекте, а по фактуработать с другим

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

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

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

Взаимное исключение

class C {synchronized void foo() {}synchronized void bar() {}static synchronized void baz() {}

}

c1.foo() c1.bar() c2.foo() C.baz()c1.foo() 8 8

c1.bar() 8 8

c2.foo() 8

C.baz() 8

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

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

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

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

Допустимо только внутри synchronized по этому же объекту

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

void notify()void notifyAll()

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

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

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

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

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

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

Атомарность

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

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

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

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

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

Видимость

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

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

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

Семантика final

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

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

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

happens-before

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

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

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

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

. . .

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