자바 잠 금 피하 기동력 노드 자바 대학 정리
1.잠 금 추가 순서
2.잠 금 시간 추가
3.잠 금 검사
잠 금 순서
여러 스 레 드 가 같은 자 물 쇠 를 필요 로 하지만 서로 다른 순서에 따라 자 물 쇠 를 추가 하면 자물쇠 가 쉽게 발생 한다.
모든 스 레 드 가 같은 순서 로 자 물 쇠 를 얻 을 수 있다 면 잠 금 은 일어나 지 않 을 것 이다.아래 의 이 예 를 보 세 요.
Thread 1:
lock A
lock B
Thread 2:
wait for A
lock C (when A locked)
Thread 3:
wait for A
wait for B
wait for C
스 레 드(예 를 들 어 스 레 드 3)에 자물쇠 가 필요 하 다 면 정확 한 순서에 따라 자 물 쇠 를 가 져 와 야 합 니 다.그것 은 순서대로 앞 에 있 는 자 물 쇠 를 얻 은 후에 야 뒤의 자 물 쇠 를 얻 을 수 있다.예 를 들 어 스 레 드 2 와 스 레 드 3 은 잠 금 A 를 가 져 온 후에 만 잠 금 C 를 가 져 올 수 있 습 니 다(잠 금 A 를 가 져 오 는 것 은 잠 금 C 를 가 져 오 는 필수 조건 입 니 다).스 레 드 1 은 잠 금 A 를 가지 고 있 기 때문에 스 레 드 2 와 3 은 잠 금 A 가 풀 릴 때 까지 기 다 려 야 합 니 다.그리고 B 나 C 에 자 물 쇠 를 채 우려 고 시도 하기 전에 A 에 자 물 쇠 를 채 우 는 데 성공 해 야 한다.
순서대로 자 물 쇠 를 채 우 는 것 은 효과 적 인 자물쇠 예방 메커니즘 이다.그러나 이런 방식 은 사용 할 수 있 는 모든 자 물 쇠 를 미리 알 아야 하지만,어떤 때 는 예측 할 수 없다.
잠 금 시한
또 다른 잠 금 을 피 할 수 있 는 방법 은 잠 금 을 가 져 오 려 고 할 때 시간 초과 시간 을 추가 하 는 것 이다.이것 은 잠 금 을 가 져 오 려 고 시도 하 는 과정 에서 이 시간 을 초과 하면 이 스 레 드 가 이 잠 금 에 대한 요 구 를 포기 하 는 것 을 의미한다.한 스 레 드 가 주어진 시간 내 에 필요 한 모든 자 물 쇠 를 성공 적 으로 얻 지 못 하면 이미 얻 은 모든 자 물 쇠 를 되 돌려 놓 고 무 작위 시간 을 기 다 렸 다가 다시 시도 합 니 다.이 무 작위 대기 시간 은 다른 스 레 드 로 하여 금 같은 자 물 쇠 를 가 져 오 려 고 시도 할 수 있 게 하고 자 물 쇠 를 얻 지 못 했 을 때 계속 실행 할 수 있 게 합 니 다(자 물 쇠 를 추가 할 때 시간 이 초과 되면 다른 일 을 계속 실행 한 다음 에 다시 돌아 서서 자 물 쇠 를 추가 하 는 논 리 를 반복 할 수 있 습 니 다).
다음은 하나의 예 입 니 다.두 스 레 드 가 서로 다른 순서 로 같은 두 개의 자 물 쇠 를 가 져 오 려 고 시도 하고 시간 초과 가 발생 한 후에 후퇴 하고 다시 시도 하 는 장면 을 보 여 줍 니 다.
Thread 1 locks A
Thread 2 locks B
Thread 1 attempts to lock B but is blocked
Thread 2 attempts to lock A but is blocked
Thread 1's lock attempt on B times out
Thread 1 backs up and releases A as well
Thread 1 waits randomly (e.g. 257 millis) before retrying.
Thread 2's lock attempt on A times out
Thread 2 backs up and releases B as well
Thread 2 waits randomly (e.g. 43 millis) before retrying.
위의 예 에서 스 레 드 2 는 스 레 드 1 보다 200 밀리초 일찍 자 물 쇠 를 다시 시도 하기 때문에 두 개의 자 물 쇠 를 먼저 성공 적 으로 얻 을 수 있 습 니 다.이때 스 레 드 1 은 잠 금 A 를 가 져 오고 대기 상태 에 있 습 니 다.스 레 드 2 가 끝 날 때 스 레 드 1 도 이 두 개의 자 물 쇠 를 순조롭게 얻 을 수 있 습 니 다.(스 레 드 2 또는 다른 스 레 드 가 스 레 드 1 에서 두 개의 자 물 쇠 를 성공 적 으로 얻 기 전에 그 중의 일부 자 물 쇠 를 얻 지 않 는 한)주의해 야 할 것 은 자물쇠 의 시간 초과 가 존재 하기 때문에 우 리 는 이런 장면 이 반드시 자물쇠 가 생 겼 다 고 생각 할 수 없다.잠 긴 스 레 드 를 얻 었 기 때 문 일 수도 있 습 니 다.
그 밖 에 같은 시간 에 같은 자원 을 경쟁 하 는 스 레 드 가 매우 많 으 면 시간 초과 와 후퇴 체제 가 있어 도 이런 스 레 드 를 반복 적 으로 시도 하지만 자 물 쇠 를 얻 지 못 할 수 있다.두 개의 스 레 드 만 있 고 다시 시도 하 는 시간 초과 시간 이 0 에서 500 밀리초 사이 로 설정 되면 이런 현상 은 발생 하지 않 을 수 있 지만 10 개 또는 20 개의 스 레 드 라면 상황 이 다르다.이 스 레 드 들 은 같은 재 시도 시간 을 기다 릴 확률 이 높 기 때문이다(또는 매우 가 까 워 서 문제 가 생 길 수 있다).시간 초과 와 재 시도 체 제 는 같은 시간 에 발생 하 는 경쟁 을 피하 기 위해 서 이다.그러나 스 레 드 가 많 을 때 그 중에서 두 개 또는 여러 스 레 드 의 시간 초과 가 같 거나 접근 할 가능성 이 매우 크기 때문에 경쟁 이 발생 하여 시간 초과 가 발생 하 더 라 도 시간 초과 와 마찬가지 로 동시에 재 시도 하기 시작 하여 새로운 경쟁 을 초래 하여 새로운 문 제 를 가 져 왔 다.)
이 메커니즘 은 자바 에서 synchronized 동기 화 블록 에 시간 을 초과 할 수 없 는 문제 가 존재 합 니 다.사용자 정의 자 물 쇠 를 만 들 거나 자바 5 의 자바 util.concurrent 패키지 에 있 는 도 구 를 사용 해 야 합 니 다.사용자 정의 잠 금 류 를 쓰 는 것 은 복잡 하지 않 지만 본문의 내용 을 초과 합 니 다.
잠 금 검사
자물쇠 검 사 는 더 좋 은 자물쇠 예방 체제 로 순서 에 따라 자 물 쇠 를 추가 하고 시간 을 초과 하 는 것 도 불가능 한 장면 을 대상 으로 한다.
한 스 레 드 가 자 물 쇠 를 얻 을 때마다 스 레 드 와 자물쇠 와 관련 된 데이터 구조(map,graph 등)에 기록 합 니 다.그 밖 에 스 레 드 가 잠 금 을 요청 할 때마다 이 데이터 구조 에 기록 해 야 합 니 다.
스 레 드 가 잠 금 을 요청 하 는 데 실 패 했 을 때 이 스 레 드 는 잠 금 의 관계 도 를 옮 겨 다 니 며 잠 금 이 발생 했 는 지 확인 할 수 있 습 니 다.예 를 들 어 스 레 드 A 는 7 자 물 쇠 를 요청 하지만 7 자 물 쇠 는 이때 스 레 드 B 가 가지 고 있 습 니 다.이때 스 레 드 A 는 스 레 드 B 가 현재 가지 고 있 는 자 물 쇠 를 요 청 했 는 지 확인 할 수 있 습 니 다.스 레 드 B 에 게 이러한 요청 이 있 었 다 면 잠 금(스 레 드 A 는 잠 금 1 이 있 고 잠 금 7 을 요청 합 니 다.스 레 드 B 는 자물쇠 7 을 가지 고 있 습 니 다.자 물 쇠 를 요청 합 니 다.1)
물론 자물쇠 가 두 라인 이 서로 상대방 의 자 물 쇠 를 가지 고 있 는 것 보다 훨씬 복잡 하 다.스 레 드 A 대기 스 레 드 B,스 레 드 B 대기 스 레 드 C,스 레 드 C 대기 스 레 드 D,스 레 드 D 는 스 레 드 A 를 기다 리 고 있 습 니 다.스 레 드 A 는 잠 금 을 검사 하기 위해 서 B 가 요청 한 모든 잠 금 을 점진 적 으로 검사 해 야 합 니 다.스 레 드 B 가 요청 한 자 물 쇠 를 시작 으로 스 레 드 A 는 스 레 드 C 를 찾 았 고 스 레 드 D 를 찾 았 습 니 다.스 레 드 D 가 요청 한 자물쇠 가 스 레 드 A 가 가지 고 있 는 것 을 발 견 했 습 니 다.이것 은 그것 이 바로 자물쇠 가 발생 했다 는 것 을 알 수 있다.
그렇다면 자물쇠 가 검출 되 었 을 때 이 라인 들 은 무엇 을 해 야 합 니까?
모든 자 물 쇠 를 풀 고 되 돌아 가 며 무 작위 시간 을 기 다 렸 다가 다시 시도 하 는 것 이 가능 하 다.이것 은 간단 한 잠 금 추가 시간 과 유사 합 니 다.다른 것 은 잠 금 추가 요청 이 시간 을 초과 해서 만 되 돌아 가 는 것 이 아 닙 니 다.비록 후퇴 와 기다 림 이 있 지만,만약 대량의 라인 이 같은 자 물 쇠 를 경쟁한다 면,그들 은 여전히 반복 적 으로 자 물 쇠 를 잠 글 것 이다.
더 좋 은 방안 은 이 스 레 드 에 우선 순 위 를 설정 하여 하나의(또는 몇 개)스 레 드 를 되 돌려 주 는 것 이다.나머지 스 레 드 는 생사 의 자 물 쇠 를 보 내지 않 은 것 처럼 그들 이 필요 로 하 는 자 물 쇠 를 계속 유지 하 는 것 이다.이 스 레 드 에 부 여 된 우선 순위 가 고정 적 으로 변 하지 않 는 다 면 같은 스 레 드 는 항상 더 높 은 우선 순 위 를 가 질 것 입 니 다.이 문 제 를 피하 기 위해 서 는 잠 금 이 발생 할 때 무 작위 우선 순 위 를 설정 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.