Тупик
Винт - очень полезный инструмент со многими приложениями, потому что он очень прост в использовании и простой для понимания. Но в то же время это также принесет некоторые проблемы, то есть это может вызвать тупик. Как только возникнет тупик, функции системы будут недоступны. Давайте сначала посмотрим на кусок кода, который приведет к тупикам, что приведет к тому, что Thread_1 и Thread Thread_2 ждать, пока друг друга выпустит блокировку.
package thread;public class DeadLockDemo {private static String A = "A";private static String B = "B";public static void main(String args[]) {new DeadLockDemo().deadLock();}private void deadLock() {// thread thread_1 Thread thread_1 = new Thread(new Runnable() {@Override public void run() {synchronized (A) {System.err.println ("-thread_1 Lock a ----"); Synchronized (b) {System.err.println ("-thread_1 Lock B ----");}}}}); // Thread_2 Thread_2 = New Thread (New Runnable () {@Override public run () {) {System.out.println ("-thread_2 Lock B -----"); Synchronized (a) {System.out.println ("-threat_2 Lock a ----");}}}}); Threat_1.Start (); Threat_2.Start ();}}});Этот код является просто демонстрацией сценариев тупика, и на самом деле вы не можете написать такой код. Но в некоторых более сложных сценариях вы можете столкнуться с такими проблемами, такие как Thread_1, не выпустили кабель, потому что некоторые ненормальные ситуации (Dead Loop). Или Thread_1 получает кабель базы данных, и при выпуске блокировки брошено исключение, но он не выпущен.
После того, как наступит тупик, бизнес ощутимый, потому что услуга не может быть предоставлена. Затем вы можете проверить только в том, какой поток имеет проблему через потоку дампа. В следующей информации потока сообщается, что строки 35 и 21 класса DeadlockDemo вызвали тупик.
"Thread -1" Prio = 6 TID = 0x000000000CB13800 NID = 0x19AC В ожидании ввода монитора [0 x000000000D67F000] java.lang.Thread.State: заблокирован (на объектном мониторе) на thread.deadlockdemo $ 2.run (deadlockdemo.java:35) - with with wallo allock.be8. java.lang.string) - заблокирован <0x00000007d5a9beb8> (java.lang.string) на java.lang.thread.run (неизвестный источник) "Thread -0" Prio = 6 Tid = 0x0000000000CB0E800 NID = 0x6BC В ожидании входа монитора [0x 0000000D48F0E800 = 0x6BC в ожидании входа монитора [0x 0000000D48F0E800] 0x6BC. java.lang.thread.state: заблокирован (на мониторе объекта) на thread.deadlockdemo $ 1.run (Deadlockdemo.java:21) - В ожидании блокировки <0x00000007d5a9beb8> (java.lang.string) - Заблокирован <0x00000007d5a988> (java.lang. java.lang.thread.run (неизвестный источник)
Несколько распространенных способов избежать тупиков.
Избегайте получения нескольких замков одновременно с потоком.
Избегайте одной нити, занимающей несколько ресурсов одновременно в веревке, и постарайтесь убедиться, что каждая веревка потребляет только один ресурс.
Попробуйте использовать временное поиск, используя Lock.trylock (Timeout) вместо использования внутреннего механизма поиска.
Для кабелей базы данных блокировка и разблокировка должны находиться в подключении к базе данных, в противном случае разблокировка не удастся.
ссылка:
//www.vevb.com/article/131946.htm
//www.vevb.com/article/131943.htm
Суммировать
Выше приведено полный анализ кодекса общих методов Java, чтобы избежать тупиков в этой статье. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!