O que é um impasse
Vamos primeiro olhar para esse exemplo de vida: há uma ponte em um rio, com um deck de ponte estreita que só pode acomodar um carro e não pode permitir que dois carros entrem em paralelo. Se dois carros A e B dirigirem até a ponte das duas extremidades da ponte, então para o carro A, ele atravessa uma seção da estrada no lado esquerdo do convés da ponte (ou seja, ocupa parte dos recursos da ponte). Se você quiser atravessar a ponte, deve esperar o carro B desistir do convés da ponte à direita. O carro A não pode avançar neste momento; Para o carro B, atravessa uma seção da estrada no lado direito do convés da ponte (ou seja, ocupa parte dos recursos da ponte). Se você quiser atravessar a ponte, deve esperar o carro A desistir do convés da ponte à esquerda, e o carro B não pode avançar no momento. Os carros de ambos os lados não reverteram, o que resultou em esperar que ele desistisse do convés da ponte, mas ninguém cedeu e esperaria sem parar. Esse fenômeno é um impasse. Se o carro for comparado a um processo e o deck da ponte for usado como um recurso, o problema acima será descrito como: Processar um Recurso R1, aguardando RR RR ocupado pelo processo B; O Processo B possui recursos RR, aguardando o recurso R1 ocupado pelo processo A. Além disso, os recursos R1 e RR permitem apenas um processo ocupar, ou seja, dois processos não podem ocupar ao mesmo tempo. Como resultado, nenhum dos processos pode continuar sendo executado. Se nenhuma outra medidas for tomada, essa situação de espera do ciclo continuará indefinidamente e ocorrerá um impasse.
Nos sistemas de computadores, os recursos de software e hardware podem ser impulsionados. Por exemplo: existe apenas um driver de CD-ROM e uma impressora no sistema. Um processo possui o driver de CD-ROM e se aplica a uma impressora; O outro processo possui a impressora e se aplica a um CD-ROM. Como resultado, ambos os processos são bloqueados e nunca podem ser desconectados por conta própria.
O chamado impasse refere-se a uma situação em que vários processos percorrem os recursos que ocupam e permanecem em um impasse indefinidamente. Obviamente, se não houver força externa, todos os processos envolvidos no impasse serão sempre bloqueados. A partir do exemplo acima, podemos ver que a razão fundamental para os impasses nos sistemas de computadores é recursos limitados e operação inadequada. Ou seja: uma razão é que o sistema fornece muito poucos recursos e está longe de atender aos requisitos de recursos dos processos simultâneos. Esse impasse causado por recursos concorrentes é o núcleo de nossa discussão. Por exemplo: a mensagem é um recurso temporário. Em algum momento, o processo A aguarda uma mensagem enviada pelo processo B, o processo B está aguardando uma mensagem enviada pelo processo C e o processo C está aguardando uma mensagem enviada pelo processo A. Se a mensagem não chegou, nenhum dos três processos A, B e C não pode avançar e os impasses também ocorrerão na comunicação de processo. Outro motivo é que os impasse causados por ordem inadequada de avanço do processo. Pequenos recursos podem não levar necessariamente a deadlocks. Assim como duas pessoas atravessando uma ponte de tábua única, se as duas precisarem passar primeiro e forem impulsionadas na ponte de tábua única, eles inevitavelmente levarão a um impasse para recursos de competição; No entanto, se duas pessoas verificam se há outras pessoas na ponte antes de irem para a ponte e subirem a ponte sozinhas quando não houver outras pessoas na ponte, o problema será resolvido. Portanto, se o programa for projetado de forma irracional e o processo for promovido de maneira inadequada, ele também causará impulsos.
Impasse
Somente quando o thread T1 ocupa O1 e também requer O2, e T2 leva o2 neste momento e também exige que o O1 haverá um impasse. (Semelhante a duas pessoas comendo com dois pauzinhos, ambos precisam de um pauzinho da outra festa para comer)
O seguinte código: o thread T1 ocupa O1 e libera apenas O1 após a obtenção do objeto O2. O tópico T2 ocupa O2 primeiro e depois adquire o1. Neste momento, o O1 é ocupado pelo thread T1, O2 é ocupado pelo fio T2, T1 e T2 estão esperando infinitamente e ocorrerá um impasse.
pacote javasimple;/** * Demonstração de deadlock * @author haokui * */public class Diesynchronized {public static void main (string [] args) {/** * Crie e inicie dois threads T1 e T2. Ambos os threads devem compartilhar dois objetos O1 e O2*/ Objeto O1 = new Object (); Objeto o2 = new Object (); Thread t1 = novo thread (novo T1 (O1, O2)); Thread T2 = novo thread (novo T2 (O1, O2)); t1.start (); t2.start (); }} // Crie duas classes threads T1 implementa runnable {objeto o1; Objeto o2; public t1 (objeto o1, objeto o2) {this.o1 = o1; this.o2 = o2; } public void run () {// trava o1 e o2 sincronizado (o1) {try {thread.sleep (1000); } catch (interruptedException e) {// TODO BLOCO DE CATCH AUTOGERATIDO E.PRINTSTACKTRACE (); } sincronizado (O2) {System.out.println ("O2"); }}}}}}} classe T2 implementa runnable {objeto o1; Objeto o2; public t2 (objeto o1, objeto o2) {this.o1 = o1; this.o2 = o2; } public void run () {sincronizado (o2) {try {thread.sleep (1000); } catch (interruptedException e) {// TODO BLOCO DE CATCH AUTOGERATIDO E.PRINTSTACKTRACE (); } sincronizado (O1) {System.out.println ("O1"); }}}} Nota: A simultaneidade ocorre apenas quando O1 e O2 são compartilhados. Dois objetos podem ser compartilhados através de construtores.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.