Приоритет потока java <br /> Особым типом ошибки, связанной с многозадачностью, которую необходимо избежать, является тупиком. Законный тупик возникает, когда две нити имеют круговую зависимость от пары синхронных объектов. Например, предположим, что один поток попадает в трубопровод объекта X, а другой поток входит в трубопровод Object Y. Если поток X пытается вызвать метод синхронизации Y, он будет заблокирован, как и ожидалось. Поток Y также хочет вызвать некоторые методы синхронизации x, а поток ожидает вечно, потому что для достижения X он должен выпустить свой собственный замок Y, чтобы завершить первый поток. Deadlock - это очень сложная ошибка, потому что:
Обычно это случается редко, и это происходит только тогда, когда время двух потоков просто соответствует.
Он может содержать более двух потоков и синхронных объектов (то есть тупики могут возникнуть, когда существует больше сложных последовательностей событий, чем только что описанный пример).
Чтобы полностью понять тупик, полезно наблюдать его поведение. Следующий пример генерирует два класса, A и B, с методами foo () и bar () соответственно. Эти два метода имеют краткую паузу перед вызовом методов других классов. Основной класс, названный Deadlock, создает случаи A и B, а затем запускает второй поток, чтобы настроить среду тупика. Методы foo () и bar () используют Sleep () для принудительного тупика.
// Пример тупика. Thread .Sele (1000); (); System .out.println (name + "Введен B.Bar"); n (имя + «Попытка позвонить в A.Last ()»); {A = new a (); (); Получить блокировку в других потоках. После запуска программы вывод выглядит следующим образом:
MainThread введен A.FoorCingThread, введенный B.BarmainThread, пытаясь позвонить в B.Last () RacingThread, пытаясь позвонить A.Last ()
Поскольку программа зашла в тупик, вам нужно нажать CTRL-C, чтобы закончить программу. Нажмите Ctrl-Break на ПК (или нажмите Ctrl-/ Under Solaris), и вы можете увидеть полную резьбу и кучу буфера трубопровода. Вы увидите, что Racingthread занимает процесс управления B, ожидая процесса управления A, и в то же время MainThread занимает ожидание процесса управления b. Программа никогда не закончится. Как показывает этот пример, ваша многопоточная программа часто заблокирована, а тупик - первая проблема, которую вы должны проверить.
Законный тупик java <br /> Особым типом ошибки, связанной с многозадачностью, которую необходимо избежать, является тупиком. Законный тупик возникает, когда две нити имеют круговую зависимость от пары синхронных объектов. Например, предположим, что один поток попадает в трубопровод объекта X, а другой поток входит в трубопровод Object Y. Если поток X пытается вызвать метод синхронизации Y, он будет заблокирован, как и ожидалось. Поток Y также хочет вызвать некоторые методы синхронизации x, а поток ожидает вечно, потому что для достижения X он должен выпустить свой собственный замок Y, чтобы завершить первый поток. Deadlock - это очень сложная ошибка, потому что:
Обычно это случается редко, и это происходит только тогда, когда время двух потоков просто соответствует.
Он может содержать более двух потоков и синхронных объектов (то есть тупики могут возникнуть, когда существует больше сложных последовательностей событий, чем только что описанный пример).
Чтобы полностью понять тупик, полезно наблюдать его поведение. Следующий пример генерирует два класса, A и B, с методами foo () и bar () соответственно. Эти два метода имеют краткую паузу перед вызовом методов других классов. Основной класс, названный Deadlock, создает случаи A и B, а затем запускает второй поток, чтобы настроить среду тупика. Методы foo () и bar () используют Sleep () для принудительного тупика.
// Пример тупика. Thread .Sele (1000); (); System .out.println (name + "Введен B.Bar"); n (имя + «Попытка позвонить в A.Last ()»); {A = new a (); (); Получить блокировку в других потоках. После запуска программы вывод выглядит следующим образом:
MainThread введен A.FoorCingThread, введенный B.BarmainThread, пытаясь позвонить в B.Last () RacingThread, пытаясь позвонить A.Last ()
Поскольку программа зашла в тупик, вам нужно нажать CTRL-C, чтобы закончить программу. Нажмите Ctrl-Break на ПК (или нажмите Ctrl-/ Under Solaris), и вы можете увидеть полную резьбу и кучу буфера трубопровода. Вы увидите, что RacingThread занимает процесс управления B, ожидая процесса управления A, и в то же время MainThread занимает ожидание процесса управления b. Программа никогда не закончится. Как показывает этот пример, ваша многопоточная программа часто заблокирована, а тупик - первая проблема, которую вы должны проверить.