Что такое тупик
Давайте сначала посмотрим на такой жизненный пример: на реке есть мост с узкой палубой моста, которая может разместить только одну машину и не может позволить двум автомобилям идти параллельно. Если две машины A и B проезжают на мост с обоих концов моста, то для автомобиля A он проходит через участок дороги на левой части палубы моста (то есть он занимает часть ресурсов моста). Если вы хотите пересечь мост, вам нужно подождать, пока автомобиль B будет отказаться от палубы моста справа. Автомобиль не может двигаться вперед в это время; Для автомобиля B он проходит через участок дороги на правой части палубы моста (то есть он занимает часть ресурсов моста). Если вы хотите пересечь мост, вам нужно ждать машины А, чтобы отказаться от палубы моста слева, а в это время автомобиль B не может двигаться вперед. Автомобили с обеих сторон не перешли, что привело к ожиданию друг друга отказаться от палубы моста, но никто не уступил и не будет ждать бесконечно. Это явление - тупик. Если автомобиль сравнивается с процессом, а палуба моста используется в качестве ресурса, то вышеуказанная проблема описывается как: процесс A обладает ресурсом R1, ожидающим ресурса RR, занятого процессом B; Процесс B обладает ресурсом RR, ожидающим ресурса R1, занятого процессом A. Кроме того, ресурсы R1 и RR позволяют только один процесс занимать, то есть два процесса не разрешаются занимать одновременно. В результате ни один процесс не может продолжать выполнять. Если никаких других мер не принято, эта ситуация с ожиданием цикла будет продолжаться бесконечно, и произойдет тупик процесса.
В компьютерных системах программное и аппаратное ресурсы могут быть запущены. Например: в системе есть только один драйвер CD-ROM и один принтер. Один процесс владеет драйвером CD-ROM и применяется к принтеру; Другой процесс владеет принтером и применяется для CD-ROM. В результате оба процесса заблокированы и никогда не могут быть отключены сами по себе.
Так называемый тупик относится к ситуации, когда несколько процессов проходят через ресурсы, которые они занимают, и остаются в непосредственной ситуации на неопределенный срок. Очевидно, что если нет внешней силы, то все процессы, связанные с тупиком, всегда будут заблокированы. Из приведенного выше примера мы видим, что основной причиной тупиков в компьютерных системах являются ограниченные ресурсы и ненадлежащую работу. То есть: одна из причин заключается в том, что система предоставляет слишком мало ресурсов и далеко не удовлетворяет требованиям к ресурсам параллельных процессов. Этот тупик, вызванный конкурирующими ресурсами, является основой нашей дискуссии. Например: сообщение является временным ресурсом. В какой -то момент процесс A ждет сообщения, отправленного процессом B, процесс B ждет сообщения, отправленного в процессе C, а процесс C ждет сообщения, отправленного процессом A. Если сообщение не появилось, ни один из трех процессов A, B и C не может двигаться вперед, и тупики также произойдут в процессе связи. Другая причина - это тупики, вызванные неуместным приказом о продвижении процесса. Небольшие ресурсы не обязательно приводят к тупикам. Подобно тому, как два человека пересекают однополосный мост, если оба они должны пройти первым и попадать в тупик на однопланке, они неизбежно приведут к тупику для конкурентных ресурсов; Однако, если два человека сначала проверяют, есть ли другие люди на мосту перед тем, как идти на мост, и поднимутся по мосту только в том случае, когда на мосту нет других людей, то проблема будет решена. Следовательно, если программа разработана необоснованно, и процесс будет способствовать ненадлежащим образом, она также вызовет тупики.
Тупик
Только когда T1 Thread занимает O1, а также требует O2, а T2 принимает O2 в настоящее время, а также требует, чтобы O1 был тупик. (Подобно двум людям, которые едят с двумя палочками для еды, им оба нужна одна палочка из другой стороны, чтобы поесть)
Следующий код: поток T1 занимает O1 и выпускает O1 только после получения объекта O2. Поток T2 сначала занимает O2, а затем приобретает O1. В настоящее время O1 занят нитью T1, O2 занят нитью T2, T1 и T2 ждут бесконечно, и произойдет тупик.
Пакет javasimple;/** * Decelock Demo * @author haokui * */public class diesynchronized {public static void main (string [] args) {/** * Создать и запустить два потока T1 и T2. Оба потока должны использовать два объекта O1 и O2*/ Object O1 = New Object (); Объект O2 = новый объект (); Потока T1 = новый поток (новый T1 (O1, O2)); Потока T2 = новый поток (новый T2 (O1, O2)); t1.start (); t2.start (); }} // Создание двух классов потоков T1 реализует Runnable {Object O1; Объект O2; public t1 (объект O1, объект O2) {this.o1 = o1; this.O2 = O2; } public void run () {// блокирует O1 и O2 Synchronized (O1) {try {thread.sleep (1000); } catch (прерванная экспрессия e) {// todo автоматически сгенерированный блок e.printstacktrace (); } синхронизированный (O2) {System.out.println ("O2"); }}}}}}} класс T2 реализует runnable {object o1; Объект O2; public t2 (объект O1, объект O2) {this.o1 = o1; this.O2 = O2; } public void run () {synchronized (o2) {try {thread.sleep (1000); } catch (прерванная экспрессия e) {// todo автоматически сгенерированный блок e.printstacktrace (); } synchronized (o1) {System.out.println ("O1"); }}}} Примечание: параллелизм возникает только тогда, когда O1 и O2 используются. Два объекта могут быть переданы через конструкторы.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.