Deadlock — это программная ситуация, когда два или более потоков заблокированы навсегда, такая ситуация возникает как минимум с двумя потоками и двумя или более ресурсами.
Здесь я написал простую программу , которая вызовет тупиковый сценарий, а затем мы посмотрим, как его проанализировать.
Вот простой пример Java:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
пакет ком . crunchify. учебные пособия ;
Импортировать Java. яз. управление . Фабрика управления ;
Импортировать Java. яз. управление . ThreadInfo ;
Импортировать Java. яз. управление . ThreadMXBean ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyThreadDeadLock {
общественности статический недействительным main ( Строка [ ] аргументы ) бросает InterruptedException {
объект obj1 знак равно новый Объект ( ) ;
объект obj2 знак равно новый Объект ( ) ;
объект obj3 знак равно новый Объект ( ) ;
Автор crunchifyThread1 знак равно новый Тема ( новая CrunchifySynchronizeThread ( obj1 , obj2 ) , crunchifyThread1 ) ;
Автор crunchifyThread2 знак равно новый Тема ( новая CrunchifySynchronizeThread ( obj2 , obj3 ) , crunchifyThread2 ) ;
Автор crunchifyThread3 знак равно новый Тема ( новая CrunchifySynchronizeThread ( obj3 , obj1 ) , crunchifyThread3 ) ;
crunchifyThread1 . начало ( ) ;
Thread. сон ( 3000 ) ;
crunchifyThread2 . начало ( ) ;
Thread. сон ( 3000 ) ;
crunchifyThread3 . начало ( ) ;
}
}
учебный класс CrunchifySynchronizeThread инвентарь Runnable {
частный объект obj1 ;
частный объект obj2 ;
общественности CrunchifySynchronizeThread ( Object obj1 , объект obj2 ) {
это. obj1 знак равно obj1 ;
это. obj2 знак равно obj2 ;
}
@Override
общественности недействительным запустить ( ) {
строка название знак равно Thread. currentThread ( ) . getName ( ) ;
синхронизированный ( obj1 ) {
Система. вне. println ( имя + получена блокировка на Object1: + obj1 ) ;
пытаться {
Thread. сон ( 10000 ) ;
} ловить ( InterruptedException е ) {
эл . printStackTrace ( ) ;
}
синхронизированный ( obj2 ) {
Система. вне. println ( имя + получена блокировка на Object2: + obj2 ) ;
}
Система. вне. println ( имя + снята блокировка на Object2: + obj2 ) ;
}
Система. вне. println ( имя + снята блокировка на Object1: + obj1 ) ;
Система. вне. println ( имя + «Закончено испытание на тупиковую ситуацию». ) ;
}
}
|
Выход:
|
1
2
3
|
crunchifyThread1 получил блокировку на Object1 : Java. яз. Object @ 59e3bddb
crunchifyThread2 получил блокировку на Object1 : Java. яз. Объект @ 294e430c
crunchifyThread3 получил блокировку на Object1 : Java. яз. Объект @ 246972f1
|
Пока ваше приложение зависает, как в примере выше, вы можете получить дамп потока и увидеть заблокированные потоки .
Например, на Mac вы можете сделать Ctrl- или просто использовать jstack и обработайте id, чтобы получить дамп потока, который делает очевидным, где находится тупик.
В этом примере дамп потока выглядит так:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
crunchifyThread3
Java. яз. Thread. Состояние : Runnable
на солнце. управление . ThreadImpl . getThreadInfo1 ( Native Метод )
на солнце. управление . ThreadImpl . getThreadInfo ( ThreadImpl . Java : 174 )
на ком . crunchify. учебники . CrunchifySynchronizeThread . getThreadDump ( CrunchifyThreadDeadLock . java : 64 )
на ком . crunchify. учебники . CrunchifySynchronizeThread . run ( CrunchifyThreadDeadLock . java : 50 )
в Яве . яз. Thread. запустить ( Тема . Java : 722 )
crunchifyThread2
Java. яз. Thread. Состояние : BLOCKED
на ком . crunchify. учебники . CrunchifySynchronizeThread . run ( CrunchifyThreadDeadLock . java : 53 )
в Яве . яз. Thread. запустить ( Тема . Java : 722 )
crunchifyThread1
Java. яз. Thread. Состояние : BLOCKED
на ком . crunchify. учебники . CrunchifySynchronizeThread . run ( CrunchifyThreadDeadLock . java : 53 )
в Яве . яз. Thread. запустить ( Тема . Java : 722 )
Диспетчер сигналов
Java. яз. Thread. Состояние : Runnable
«Финалайзер»
Java. яз. Thread. Состояние : ОЖИДАНИЯ
в Яве . яз. Объект . ждать (Родной Метод )
в Яве . яз. ссылка ReferenceQueue . удалить ( ReferenceQueue . Java : 135 )
в Яве . яз. ссылка ReferenceQueue . удалить ( ReferenceQueue . Java : 151 )
в Яве . яз. ссылка Финализатор $ FinalizerThread . запустить ( Финализатор . Ява : 189 )
«Ссылочный обработчик»
Java. яз. Thread. Состояние : ОЖИДАНИЯ
в Яве . яз. Объект . ждать (Родной Метод )
в Яве . яз. Объект . подождите ( Объект . Java : 503 )
в Яве . яз. ссылка Ссылка $ ReferenceHandler . запустить ( Справ . Ява : 133 )
|
Заметил здесь, ЗАБЛОКИРОВАН и ОЖИДАЕТ threads => Deadlock ситуация здесь .. В следующем примере предоставим простую Java-программу для программного генерирования вышеупомянутого дампа потока .
0.00 (0%) 0 votes






