자바 프로젝트 의 여러 스 레 드 가 있 습 니 다.잠 금 을 어떻게 찾 습 니까?

프로젝트 에 여러 개의 스 레 드 가 있 을 때,어떻게 잠 금 을 찾 습 니까?
최근 IDEA 에서 다 중 스 레 드 프로 그래 밍 을 할 때 스 레 드 에 자 물 쇠 를 추가 할 때 항상 잠 금 문제 가 발생 하지만 프로그램 이 잠 금 문제 가 발생 할 때 컴 파일 러 는 잘못된 정확 한 위 치 를 정확하게 표시 하지 못 한다.프로젝트 코드 가 많 을 때 불필요 한 번 거 로 움 을 추가 하 는 경우 가 많 습 니 다.오늘 은 몇 가지 해결 방법 을 공유 하 겠 습 니 다.
1.컴 파일 환경
IDEA 2020,windows 10,jdk 8 및 이상 버 전
1.자물쇠 가 뭐 예요?
잠 금 은 A 스 레 드 가 자원 을 사용 하려 고 했 으 나 B 스 레 드 에 의 해 점용 되 었 습 니 다.B 스 레 드 가 자원 을 사용 하려 고 했 으 나 A 스 레 드 에 의 해 점용 되 어 프로그램 이 계속 진행 되 지 못 했 습 니 다.
1.1 잠 금 의 예;

public class Deadlock {
    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1){
                    System.out.println("      lock1");
                    try{
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("     lock2");
                    synchronized (lock2){
                        System.out.println("      lock2");
                    }
                }
            }
        });
        thread1.start();


        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock2){
                    System.out.println("      lock2");
                    try{
                        //   2,   1
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("     lock1");
                    //    lock1
                    synchronized (lock1){
                        System.out.println("      lock1");
                    }
                }
            }
        });
        thread2.start();
    }
}
在这里插入图片描述
1.2 잠 금 의 예;
잠 금 형성 조건:
1.상호 배척 조건:(하나의 자원 이 하나의 스 레 드 에 의 해 소유 되 고 하나의 스 레 드 에 의 해 소유 되면 다른 스 레 드 에 의 해 소유 되 지 못 합 니 다)
2.조건 을 요청 합 니 다(한 스 레 드 에 있 는 자원 을 가지 고 있 으 면 다른 자원 을 요청 합 니 다).수정 할 수 있 습 니 다.
3.박탈 할 수 없 음:(하나의 자원 이 하나의 스 레 드 에 의 해 소유 되 었 을 때 이 스 레 드 가 이 자원 을 방출 하지 않 으 면 다른 스 레 드 는 이 자원 을 강제로 얻 을 수 없습니다)
4.순환 대기 조건(여러 스 레 드 가 자원 을 가 져 올 때 하나의 링 체인 을 형성)을 수정 할 수 있 습 니 다.
2.jdk 내장 도구 로 잠 금 검사
방법 1.jconsole.exe
jdk 설치 경로 에 들 어가 jdk/bin/jconsole.exe 를 엽 니 다.
사용 절 차 는 다음 과 같다.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
검사 결과:
在这里插入图片描述
방법 2.jvisualvm.exe
jdk 설치 경로 에 들 어가 jdk/bin/jvisualvm.exe 를 엽 니 다.
장점:비교적 가 늘 고 전면적
단점:로 딩 이 느 려 요!
사용 절 차 는 다음 과 같다.
在这里插入图片描述
在这里插入图片描述
이 프로젝트 코드 의 39 번 째 줄 에 자물쇠 가 잠 겨 있 는 것 을 볼 수 있다.
방법 3.jmc.exe
jdk 설치 경로 에 들 어가 jdk/bin/jmc.exe 를 엽 니 다.
장점:그래서 잠 금 을 판단 할 수 있다.
단점:해결책 을 제시 하지 않 았 다
사용 절 차 는 다음 과 같다.
在这里插入图片描述
3.자물쇠 해결 방법
자물쇠 의 형성 조건 을 통 해 자물쇠 문 제 를 해결 하고 근원 적 으로 자 물 쇠 를 없앤다.
1.조건 이 있 기 를 요청 합 니 다(한 스 레 드 에 있 는 자원 을 가지 고 있 으 면 다른 자원 을 요청 합 니 다).수정 할 수 있 습 니 다.
2.순환 대기 조건(여러 스 레 드 가 자원 을 가 져 올 때 하나의 링 체인 을 형성)을 수정 할 수 있 습 니 다.
예 를 들 어 수정:방법:(순환 대기 조건 수정)
//스 레 드 2 와 스 레 드 가 같은 자 물 쇠 를 경쟁 하고 병행 으로 수정 하여 순환 도로 가 나타 나 지 않도록 합 니 다.

public class Deadlock {
    public static void main(String[] args) {
        Object lock1 = new Object();
        Object lock2 = new Object();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1){
                    System.out.println("      lock1");
                    try{
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("     lock2");
                    synchronized (lock2){
                        System.out.println("      lock2");
                    }
                }
            }
        });
        thread1.start();


        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1){   //              ,     ,        
                    System.out.println("      lock1"); 
                    try{
                        //   2,   1
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("     lock1");
                    //    lock1
                    synchronized (lock2){
                        System.out.println("      lock2");
                    }
                }
            }
        });
        thread2.start();

    }
}
在这里插入图片描述
총화
자바 프로젝트 의 여러 스 레 드 에서 잠 금 을 어떻게 찾 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 다 중 스 레 드 에서 잠 금 내용 을 찾 으 려 면 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 희 를 많이 사랑 해 주세요!

좋은 웹페이지 즐겨찾기