Java 스레드의 우선 순위 및 잠금 해제 상세 정보
다중 작업 처리와 관련된 특수한 오류 형식은 잠금 (deadlock) 입니다.사쇄는 두 라인이 한 쌍의 동기화 대상에 순환 의존 관계가 있을 때 발생한다.예를 들어 한 라인이 대상 X의 파이프라인에 들어갔고 다른 라인이 대상 Y의 파이프라인에 들어갔다고 가정한다.만약 X의 스레드가 Y의 동기화 방법을 호출하려고 시도한다면, 그것은 예상대로 잠길 것이다.Y의 스레드 역시 X의 동기화 방법을 사용하기를 원한다. 스레드는 영원히 기다린다. 왜냐하면 X에 도달하기 위해서는 자신의 Y의 잠금을 풀어서 첫 번째 스레드가 완성될 수 있도록 해야 하기 때문이다.고정 자물쇠는 디버깅하기 어려운 오류입니다. 왜냐하면:
통상적으로, 그것은 극히 적게 발생하며, 두 라인의 시간대가 딱 맞을 때만 발생할 수 있다.
그것은 두 개 이상의 루틴과 동기화 대상을 포함할 수 있다. (즉, 자물쇠는 방금 말한 예보다 더 복잡한 사건 서열이 있을 때 발생할 수 있다.)
자물쇠를 충분히 이해하기 위해서는 자물쇠의 행동을 관찰하는 것이 매우 유용하다.다음 예는 두 가지 종류, A와 B를 생성했는데 각각foo()와bar() 방법이 있다.이 두 가지 방법은 다른 방법을 사용하기 전에 잠시 멈추었다.주 클래스, 이름은Deadlock입니다. A와 B의 실례를 만들고 두 번째 라인을 시작하여 잠금 환경을 설정합니다.foo()와bar() 방법은sleep()를 사용하여 자물쇠를 강제로 잠그는 현상이 발생합니다.
// An example of deadlock.
class A {
synchronized void foo(B b) {
String name = Thread.currentThread().getName();
System.out.println(name + " entered A.foo");
try {
Thread.sleep(1000);
} catch(Exception e) {
System.out.println("A Interrupted");
}
System.out.println(name + " trying to call B.last()");
b.last();
}
synchronized void last() {
System.out.println("Inside A.last");
}
}
class B {
synchronized void bar(A a) {
String name = Thread.currentThread().getName();
System.out.println(name + " entered B.bar");
try {
Thread.sleep(1000);
} catch(Exception e) {
System.out.println("B Interrupted");
}
System.out.println(name + " trying to call A.last()");
a.last();
}
synchronized void last() {
System.out.println("Inside A.last");
}
}
class Deadlock implements Runnable {
A a = new A();
B b = new B();
Deadlock() {
Thread.currentThread().setName("MainThread");
Thread t = new Thread(this, "RacingThread");
t.start();
a.foo(b); // get lock on a in this thread.
System.out.println("Back in main thread");
}
public void run() {
b.bar(a); // get lock on b in other thread.
System.out.println("Back in other thread");
}
public static void main(String args[]) {
new Deadlock();
}
}
프로그램을 실행하면 다음과 같이 출력됩니다.
MainThread entered A.foo
RacingThread entered B.bar
MainThread trying to call B.last()
RacingThread trying to call A.last()
프로그램이 잠겨 있기 때문에, Ctrl-C를 눌러서 프로그램을 끝내야 합니다.PC에서 Ctrl-BREAK(또는 Solaris 아래에서 Ctrl-\)를 누르면 전체 스레드와 파이프라인 버퍼를 볼 수 있습니다.RacingThread가 튜브 a를 기다릴 때 튜브 b를 차지하는 것을 볼 수 있을 뿐만 아니라,MainThread가 a를 기다립니다.그 프로그램은 영원히 끝나지 않을 것이다.이 예에서 설명한 바와 같이, 당신의 다중 루틴 프로그램은 자주 잠겨 있으며, 자물쇠가 끊어지는 것은 당신이 먼저 검사해야 할 문제이다.Java 스레드 잠금 해제
다중 작업 처리와 관련된 특수한 오류 형식은 잠금 (deadlock) 입니다.사쇄는 두 라인이 한 쌍의 동기화 대상에 순환 의존 관계가 있을 때 발생한다.예를 들어 한 라인이 대상 X의 파이프라인에 들어갔고 다른 라인이 대상 Y의 파이프라인에 들어갔다고 가정한다.만약 X의 스레드가 Y의 동기화 방법을 호출하려고 시도한다면, 그것은 예상대로 잠길 것이다.Y의 스레드 역시 X의 동기화 방법을 사용하기를 원한다. 스레드는 영원히 기다린다. 왜냐하면 X에 도달하기 위해서는 자신의 Y의 잠금을 풀어서 첫 번째 스레드가 완성될 수 있도록 해야 하기 때문이다.고정 자물쇠는 디버깅하기 어려운 오류입니다. 왜냐하면:
통상적으로, 그것은 극히 적게 발생하며, 두 라인의 시간대가 딱 맞을 때만 발생할 수 있다.
그것은 두 개 이상의 루틴과 동기화 대상을 포함할 수 있다. (즉, 자물쇠는 방금 말한 예보다 더 복잡한 사건 서열이 있을 때 발생할 수 있다.)
자물쇠를 충분히 이해하기 위해서는 자물쇠의 행동을 관찰하는 것이 매우 유용하다.다음 예는 두 가지 종류, A와 B를 생성했는데 각각foo()와bar() 방법이 있다.이 두 가지 방법은 다른 방법을 사용하기 전에 잠시 멈추었다.주 클래스, 이름은Deadlock입니다. A와 B의 실례를 만들고 두 번째 라인을 시작하여 잠금 환경을 설정합니다.foo()와bar() 방법은sleep()를 사용하여 자물쇠를 강제로 잠그는 현상이 발생합니다.
// An example of deadlock.
class A {
synchronized void foo(B b) {
String name = Thread.currentThread().getName();
System.out.println(name + " entered A.foo");
try {
Thread.sleep(1000);
} catch(Exception e) {
System.out.println("A Interrupted");
}
System.out.println(name + " trying to call B.last()");
b.last();
}
synchronized void last() {
System.out.println("Inside A.last");
}
}
class B {
synchronized void bar(A a) {
String name = Thread.currentThread().getName();
System.out.println(name + " entered B.bar");
try {
Thread.sleep(1000);
} catch(Exception e) {
System.out.println("B Interrupted");
}
System.out.println(name + " trying to call A.last()");
a.last();
}
synchronized void last() {
System.out.println("Inside A.last");
}
}
class Deadlock implements Runnable {
A a = new A();
B b = new B();
Deadlock() {
Thread.currentThread().setName("MainThread");
Thread t = new Thread(this, "RacingThread");
t.start();
a.foo(b); // get lock on a in this thread.
System.out.println("Back in main thread");
}
public void run() {
b.bar(a); // get lock on b in other thread.
System.out.println("Back in other thread");
}
public static void main(String args[]) {
new Deadlock();
}
}
프로그램을 실행하면 다음과 같이 출력됩니다.
MainThread entered A.foo
RacingThread entered B.bar
MainThread trying to call B.last()
RacingThread trying to call A.last()
프로그램이 잠겨 있기 때문에, Ctrl-C를 눌러서 프로그램을 끝내야 합니다.PC에서 Ctrl-BREAK(또는 Solaris 아래에서 Ctrl-\)를 누르면 전체 스레드와 파이프라인 버퍼를 볼 수 있습니다.RacingThread가 튜브 a를 기다릴 때 튜브 b를 차지하는 것을 볼 수 있을 뿐만 아니라,MainThread가 a를 기다립니다.그 프로그램은 영원히 끝나지 않을 것이다.이 예에서 설명한 바와 같이, 당신의 다중 루틴 프로그램은 자주 잠겨 있으며, 자물쇠가 끊어지는 것은 당신이 먼저 검사해야 할 문제이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.