>  기사  >  Java  >  Java의 교착상태 개념과 해결방법

Java의 교착상태 개념과 해결방법

零下一度
零下一度원래의
2017-07-20 13:41:312855검색

1. 프로세스 교착 상태 및 해결 방법

1. 중요 팁

(1) 교착 상태의 개념과 근본 원인을 숙지하세요.

(2) 교착 상태의 필요 조건을 이해합니다. 상호 배제 조건, 비선점 조건, 소유 및 적용 조건, 루프 대기 조건의 네 가지 조건이 동시에 충족되어야 합니다.

(3) 교착 상태를 해결하는 일반적인 방법을 기억하고 교착 상태 예방 및 교착 상태 회피의 기본 개념을 숙지하세요.

(4) 교착상태 예방 전략에서 자원의 질서 있는 할당 전략을 숙지하세요.

(5) 프로세스 안전 시퀀스의 개념과 교착 상태와 안전 시퀀스의 관계를 이해합니다.

(6) 은행가의 알고리즘을 이해합니다.

(7) 자원배분도를 이해한다.

(8) 교착 상태 감지 및 복구 개념을 이해합니다.

2. 교착 상태에 관해 개인적인 이해:

일정 기간 연구를 통해 제가 이해한 교착 상태의 개념은 예를 들어 두 개의 프로세스가 있고 각 프로세스는 두 개의 잠금(잠금 1)으로 잠겨 있다는 것입니다. , 잠금 2), 잠겨 있습니다. 차이점은 두 프로세스에서 잠금 적용 위치가 다르다는 것입니다. 결과적으로 프로세스를 완전히 시작하려면 내부 잠금이 필요하며 이 잠금은 다른 프로세스에서 발생합니다. 다른 프로세스가 내부 프로세스를 완전히 시작(또는 실행)하는 데 필요한 잠금은 다른 프로그램에 있습니다. 이렇게 서로 얽혀 있고, 모두 준비 단계지만 실행을 할 수 없는 상태다. 교착 상태가 발생했습니다. 내 이해를 바탕으로 도식을 그렸습니다:

3. 교착 상태에 대한 간단한 코드:
public class Test15 {public static void main(String[] args) throws InterruptedException {new Thread(new DeadLockThread(true)).start();//Thread.sleep(10);在中间用上它可以使结果交替出现,我是为了看死锁的效果,用它对比一下。new Thread(new DeadLockThread(false)).start();
    }
}class DeadLockThread implements Runnable {static Object o1 = new Object();static Object o2 = new Object();private boolean flag;

    DeadLockThread(boolean flag) {this.flag = flag;
    }public void run() {if (flag == true) {while (true) {synchronized (o1) {
                    System.out.println("这是锁o1");synchronized (o2) {
                        System.out.println("这是锁o2");
                    }
인쇄 결과:

4.
교착상태에 대하여 , 몇 가지 정보를 검색했는데 여기서 문제가 상당히 복잡하다고 생각합니다. 이 단계에서는 이러한 간단한 원리만 이해됩니다. 교착상태가 발생하려면 네 가지 특정 조건이 충족되어야 한다는 것도 대략적으로 이해할 수 있습니다. 1) 상호 배제 조건:
은 프로세스가 할당된 자원을 독점적으로 사용하는 것을 의미합니다. 즉, 특정 자원은 일정 시간 내에 하나의 프로세스에만 점유됩니다. 이때 다른 프로세스가 자원을 요청하고 있다면 요청자는 자원을 점유하고 있는 프로세스가 해제될 때까지만 기다릴 수 있다.
2) 요청 및 보유 조건:
프로세스가 하나 이상의 리소스를 유지했지만 새로운 리소스 요청을 했으며, 해당 리소스가 다른 프로세스에 의해 점유되었음을 의미하며, 이때 요청 프로세스는 차단됩니다. 하지만 이미 자원을 획득했습니다. 다른 자원은 변경되지 않습니다.
3) 비박탈 조건:
프로세스를 통해 획득한 자원은 모두 소모되기 전에는 박탈할 수 없으며, 다 소모한 후에만 스스로 해제할 수 있습니다.
4) 루프 대기 조건:
교착 상태가 발생하면 프로세스가 있어야 함을 의미합니다. 자원의 순환 체인, 즉 프로세스 세트 {P0, P1, P2,···,Pn}의 P0입니다. P1이 점유한 자원을 기다리고 있습니다. P1은 P2가 점유한 자원을 기다리고 있습니다. Pn은 P0이 점유한 자원을 기다리고 있습니다.
첨부 파일:
1) sleep() 메서드를 호출하면 스레드가 보유하고 있는 동기화 잠금을 해제할 수 없으며 이 기간 동안 다른 스레드의 작업을 방해하지 않습니다.2) wait( )를 호출합니다. 메서드를 사용하면 현재 실행 중인 스레드가 대기 상태로 들어가 다른 스레드가 이 객체의 inform() 또는 informAll() 메서드를 다시 호출하여 깨울 때까지 기다리거나, 스레드가 지정된 대기 시간 후에 자동으로 깨어납니다.
스레드가 하나 이상의 개체에 대한 동기화 잠금을 소유한 경우 wait()를 호출한 후 스레드는 wait() 메서드가 호출된 개체에 국한되지 않고 보유하고 있는 모든 동기화 리소스를 해제합니다.
3) 실제 개발에서 교착상태는 일반적으로 깊숙이 숨겨져 있어 발견하기가 쉽지 않습니다. 교착상태가 발생하면 필연적으로 프로그램 마비가 발생합니다. 그러므로 반드시 피해야 합니다.

위 내용은 Java의 교착상태 개념과 해결방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.