View
172
Download
1
Category
Preview:
Citation preview
Многопоточность в Java: основы
Алексей Владыкин
17 ноября 2014
Алексей Владыкин Многопоточность (1) 17 ноября 2014 1 / 24
1 Общие сведения о параллелизме
2 Управление потоками
3 Синхронизация потоков
4 Модель памяти
Алексей Владыкин Многопоточность (1) 17 ноября 2014 2 / 24
Общие сведения о параллелизме
Алексей Владыкин Многопоточность (1) 17 ноября 2014 3 / 24
Общие сведения о параллелизме
Мотивация
Одновременное выполнение нескольких действий(например, отрисовка пользовательского интерфейса и передачафайлов по сети)
Ускорение вычислений(при наличии нескольких вычислительных ядер)
Алексей Владыкин Многопоточность (1) 17 ноября 2014 4 / 24
Общие сведения о параллелизме
Закон Амдала
S(N) =1
(1− P) + PN
S — ускорение (speedup)P — доля вычислений, которые возможно распараллелитьN — количество вычислительных ядер
Алексей Владыкин Многопоточность (1) 17 ноября 2014 5 / 24
Общие сведения о параллелизме
Параллелизм в Java
Запуск нескольких JVM на одном или на разных компьютерахНет общей памятиВзаимодействие через файловую систему или сетевое соединение
Запуск нескольких потоков внутри JVMЕсть общая памятьОбширная поддержка в языке и стандартной библиотеке
Алексей Владыкин Многопоточность (1) 17 ноября 2014 6 / 24
Общие сведения о параллелизме
Параллелизм в Java
Запуск нескольких JVM на одном или на разных компьютерахНет общей памятиВзаимодействие через файловую систему или сетевое соединение
Запуск нескольких потоков внутри JVMЕсть общая памятьОбширная поддержка в языке и стандартной библиотеке
Алексей Владыкин Многопоточность (1) 17 ноября 2014 6 / 24
Общие сведения о параллелизме
Проблемы параллельных программ
Гонка (race condition)
Взаимная блокировка (deadlock)
Алексей Владыкин Многопоточность (1) 17 ноября 2014 7 / 24
Управление потоками
Алексей Владыкин Многопоточность (1) 17 ноября 2014 8 / 24
Управление потоками
java.lang.Thread
Потоки представлены экземплярами класса java.lang.Thread
String getName()
long getId()
boolean isDaemon()
StackTraceElement[] getStackTrace()
ThreadGroup getThreadGroup()
Алексей Владыкин Многопоточность (1) 17 ноября 2014 9 / 24
Управление потоками
Thread dump
Список всех потоков с их состояниями и stack trace’ами
Ctrl+Break или Ctrl+\
jps -l, затем jstack PID
Кнопка в IDE
Алексей Владыкин Многопоточность (1) 17 ноября 2014 10 / 24
Управление потоками
Создание потока: подкласс Thread
Thread thread = new Thread () {
@Overridepublic void run() {
// do some work}
}
Алексей Владыкин Многопоточность (1) 17 ноября 2014 11 / 24
Управление потоками
Создание потока: Runnable
Runnable runnable = new Runnable () {
@Overridepublic void run() {
// do some work}
};
Thread thread = new Thread(runnable );
Алексей Владыкин Многопоточность (1) 17 ноября 2014 12 / 24
Управление потоками
Жизненный цикл потока
Создание объекта Thread
Запускthread.start()
Работавыполняется метод run(), thread.isAlive() == true
Завершениеметод run() закончился или бросил исключение
Завершенный поток нельзя перезапустить
Алексей Владыкин Многопоточность (1) 17 ноября 2014 13 / 24
Управление потоками
Прерывание потока
thread.interrupt()
Если поток находится в ожидании (sleep, join, wait), тоожидание прерывается исключением InterruptedException
Иначе у потока просто устанавливается флаг interruptedфлаг проверяется методами interrupted() и isInterrupted()проверять флаг и завершать поток надо самостоятельно
thread.join()
Алексей Владыкин Многопоточность (1) 17 ноября 2014 14 / 24
Синхронизация потоков
Алексей Владыкин Многопоточность (1) 17 ноября 2014 15 / 24
Синхронизация потоков
Возможности встроенной синхронизации
Взаимное исключение(пока один поток что-то делает, другие не могут ему помешать)
Ожидание и уведомление(поток ожидает уведомлений от других потоков)
Алексей Владыкин Многопоточность (1) 17 ноября 2014 16 / 24
Синхронизация потоков
Ключевое слово synchronized
Синхронизованный метод
public synchronized void doSomething () {// ...
}
Синхронизованный блок внутри метода
public void doSomething () {synchronized (obj) {
// ...}
}
Алексей Владыкин Многопоточность (1) 17 ноября 2014 17 / 24
Синхронизация потоков
Ключевое слово synchronized
Синхронизация блоков — по монитору указанного объекта
Синхронизация методов — по монитору текущего объекта (this)
Синхронизация статических методов — по монитору класса
Алексей Владыкин Многопоточность (1) 17 ноября 2014 18 / 24
Синхронизация потоков
Ожидание и уведомления
Допустимо только внутри synchronized
void wait()void wait(long millis)void wait(long millis, int nanos)
void notify()void notifyAll()
Алексей Владыкин Многопоточность (1) 17 ноября 2014 19 / 24
Модель памяти
Алексей Владыкин Многопоточность (1) 17 ноября 2014 20 / 24
Модель памяти
Атомарность
Чтение и запись полей всех типов, кроме long и double,происходит атомарно
Если поле объявлено с модификатором volatile, то атомарночитаются и пишутся даже long и double
Алексей Владыкин Многопоточность (1) 17 ноября 2014 21 / 24
Модель памяти
Видимость
Изменения значений полей, сделанные одним потоком, могутбыть не видны в другом потоке
Изменения, сделанные одним потоком, могут быть видны вдругом потоке в ином порядке
Правила формализованы при помощи отношения happens-before
Семантика final
Алексей Владыкин Многопоточность (1) 17 ноября 2014 22 / 24
Модель памяти
happens-before
Запись volatile-поля happens-before чтения этого поля
Освобождение монитора happens-before захват того жемонитора
thread.start() happens-before thread.run()
Завершение thread.run() happens-before выход изthread.join()
. . .
Алексей Владыкин Многопоточность (1) 17 ноября 2014 23 / 24
Что сегодня узнали
Какие бывают виды параллелизма и как они поддерживаются вJava
Как в Java запускать и останавливать потоки
Какие в Java есть встроенные в язык средства синхронизациипотоков
Что такое Java Memory Model
Алексей Владыкин Многопоточность (1) 17 ноября 2014 24 / 24
Recommended