Понимание базовой многпоточности

Содержание

Слайд 2

Обо мне Artem Larin Senior Java Developer at

Обо мне

Artem Larin
Senior Java Developer at

Слайд 3

Когда я читаю многопоточный код… public synchronized int getSyncA() { …

Когда я читаю многопоточный код…

public synchronized int getSyncA() {

Thread t1 =

new Thread() {
public void run() {
synchronized (one) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {

t1.start();
Thread.sleep(200);
t2.start();
Слайд 4

Я вижу это…

Я вижу это…

Слайд 5

Когда я думаю о многопоточном коде…

Когда я думаю о многопоточном коде…

Слайд 6

Где же «секретное оружие»?

Где же «секретное оружие»?

Слайд 7

Бесконечный список книг?

Бесконечный список книг?

Слайд 8

Сакральное знание?

Сакральное знание?

Слайд 9

Ключи к пониманию базовой многопоточности Секретное оружие №1 Секретное оружие №2

Ключи к пониманию базовой многопоточности

Секретное оружие №1
Секретное оружие №2

Слайд 10

Секретное оружие №1 Это знание машины состояний потока

Секретное оружие №1

Это знание машины состояний потока

Слайд 11

Коне́чный автома́т — абстрактный автомат, число возможных внутренних состояний которого конечно (!).

Коне́чный автома́т — абстрактный автомат, число возможных внутренних состояний которого конечно (!).

Слайд 12

Слайд 13

Машина состояний потока Состояния Переходы События

Машина состояний потока

Состояния
Переходы
События

Слайд 14

Машина состояний потока

Машина состояний потока

Слайд 15

Машина состояний потока

Машина состояний потока

Слайд 16

Машина состояний потока

Машина состояний потока

Слайд 17

Как читать диаграмму? Правило №1 Надпись над стрелкой – это вызов метода на объекте потока

Как читать диаграмму? Правило №1

Надпись над стрелкой –
это вызов метода на

объекте потока
Слайд 18

Например Thread t1 = new Thread() {…} t1.start();

Например

Thread t1 = new Thread() {…}
t1.start();

Слайд 19

Как читать диаграмму? Правило №2 В один момент времени поток находится в одном состоянии.

Как читать диаграмму? Правило №2

В один момент времени поток
находится в одном состоянии.

Слайд 20

Как читать диаграмму? Правило №3 Поток не имеет других состояний и переходов.

Как читать диаграмму? Правило №3

Поток не имеет других
состояний и переходов.

Слайд 21

Секретное оружие №2 Это переход в другое измерение времени (как в фильме «Прибытие»)

Секретное оружие №2

Это переход в другое измерение времени
(как в фильме «Прибытие»)

Слайд 22

Мы пытаемся понять код в чужом временном измерении

Мы пытаемся понять код в чужом временном измерении

Слайд 23

-> 37 m:R 38 -> t:N 40 -> t:R А нужно

-> 37 m:R
38 -> t:N
40 -> t:R

А нужно расписать переходы потоков
на

псевдоязыке
последовательно во времени,
как видят время обычные люди
Слайд 24

Что за «псевдоязык»? -> 37 m:R (эта запись означает, что при

Что за «псевдоязык»?

-> 37 m:R (эта запись означает, что при переходе управления

на строку 37 главный поток main (сокращенно m), переходит в состояние Runnable) 38 -> t:N (при передаче управления с 38 строки поток t переходит в состояние New) 40 -> t:R (при передаче управления с 40 строки поток t находится в состоянии Runnable, потому что был вызван метод t.start())
Слайд 25

Что за «псевдоязык»? -> 37 m get(obj1) (при переходе управления на

Что за «псевдоязык»?

-> 37 m get(obj1) (при переходе управления на строку 37

главный поток main захватил монитор объекта obj1)
37: synchronized (obj1) {
….
}
Слайд 26

Что за «псевдоязык»? 39 -> m rel(obj1) (при переходе управления со

Что за «псевдоязык»?

39 -> m rel(obj1) (при переходе управления со строки 39

главный поток main отпустил монитор объекта obj1)
synchronized (obj1) {
….
39: }
Слайд 27

При этом не забываем правила! В один момент времени поток находится

При этом не забываем правила!
В один момент времени поток
находится только в

1 состоянии!

«Фишка» потока 1
«Фишка» потока 2

Слайд 28

Не нужно описывать каждую строчку кода. Указывайте только те, в которых происходят изменения состояния какого-либо потока.

Не нужно описывать каждую строчку кода. Указывайте только те, в которых

происходят изменения состояния какого-либо потока.
Слайд 29

Закрепим навыки

Закрепим навыки

Слайд 30

Слайд 31

Другие способы определения дедлоков JDK: jps/jstack OpenJDK: JCStress (Алексей Шипилев)

Другие способы определения дедлоков

JDK: jps/jstack
OpenJDK: JCStress (Алексей Шипилев)