> Java > java지도 시간 > Java에서 교착상태를 일으키는 상황은 무엇입니까?

Java에서 교착상태를 일으키는 상황은 무엇입니까?

王林
풀어 주다: 2023-05-23 12:46:06
앞으로
1124명이 탐색했습니다.

Java가 교착 상태를 일으키는 4가지 상황

1. 교차 잠금으로 인해 프로그램 교착 상태가 발생함: 예를 들어 스레드 A는 R1의 잠금을 보유하고 R2의 잠금을 기다리고 스레드 B는 R2의 잠금을 보유하고 R1의 잠금을 기다립니다. .

2. 메모리 부족: 예를 들어 T1과 T2라는 두 개의 스레드가 있는데 T1은 10MB의 메모리를 확보했고 T2는 15MB의 메모리를 확보해야 작동하지만 나머지는 사용할 수 있습니다. 메모리는 10MB입니다. 따라서 두 스레드는 모두 서로 메모리 리소스를 해제하기를 기다리고 있습니다.

3. 질문과 답변 데이터 교환: 서버는 특정 포트를 열고 클라이언트가 액세스할 때까지 기다립니다. 클라이언트가 요청을 보낸 후 서버는 어떤 이유로 클라이언트 요청을 놓치게 됩니다. 서버가 응답하는 동안 서버는 클라이언트가 요청을 보낼 때까지 기다립니다.

4. 무한 루프로 인한 교착 상태: jstack 등의 도구를 사용하면 교착 상태를 볼 수 없지만 프로그램이 작동하지 않고 CPU 사용량이 높은 경우를 시스템 정지 애니메이션이라고도 합니다. 문제를 해결하고 재현하기가 어렵습니다.

교착상태 관련 예시

public class Main {
    private final Object MUTEX_READ = new Object();
    private final Object MUTEX_WRITE = new Object();
 
    public void read(){
        synchronized (MUTEX_READ){
            synchronized (MUTEX_WRITE){
            }
        }
    }
 
    public void write(){
        synchronized (MUTEX_WRITE){
            synchronized (MUTEX_READ){
            }
        }
    }
 
    public static void main(String[] args) throws InterruptedException {
        Main m = new Main();
        new Thread(()->{
            while (true){
                m.read();
            }
        }).start();
        new Thread(()->{
            while (true){
                m.write();
            }
        }).start();
    }
}
로그인 후 복사

위 내용은 Java에서 교착상태를 일으키는 상황은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿