Домой Учебники по Java и J2EE Как программно генерировать Java тупик и как анализировать тупик

Как программно генерировать Java тупик и как анализировать тупик

423
0

Deadlock — это программная ситуация, когда два или более потоков заблокированы навсегда, такая ситуация возникает как минимум с двумя потоками и двумя или более ресурсами.

Здесь я написал простую программу , которая вызовет тупиковый сценарий, а затем мы посмотрим, как его проанализировать.

Вот простой пример Java:

CrunchifyThreadDeadLock.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

Пока ваше приложение зависает, как в примере выше, вы можете получить дамп потока и увидеть заблокированные потоки .

ЧИТАТЬ ТАКЖЕ:  Руководство для начинающих по Java eNum - зачем и для чего мне использовать Enum? Примеры Java Enum

Например, на 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-программу для программного генерирования вышеупомянутого дампа потока .

Как программно генерировать Java тупик и как анализировать тупик

0.00 (0%) 0 votes

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь