2014-07-12 2 views
2

나는 초보자이며 현재 스레드 동기화 장을보고있다.인스턴스 메서드에 정적 잠금을 설정하면 어떻게됩니까?

1 : 내가 여기

잠금 스레드에서 하나 개의 시나리오에 관한 질문이있는 것은 내가 아는 것입니다 내가 인스턴스 메소드의 인스턴스 잠금을 넣을 때 (예) 무슨 일이 일어날 지 여기

private Object lock1= new Object(); 
private Object lock2 = new Object(); 
void f1(){ 
    synchronized (lock1) { 

    } 
} 
void f2(){ 
    synchronized (lock2) { 

    } 
} 

void f4(){ 
    synchronized (lock2) { 

    } 
} 
void f3(){ 
    synchronized (lock1) { 

    } 
} 

그것이 클래스 X의 객체 A가 다중 쓰레드에 의해 공유되고 어떤 쓰레드 t1이 f1의 블록을 수행하고 있다면, t1이 f1 블록이 될 때까지 함수 f3, f1을 입력하려고하는 다른 모든 쓰레드는 블로킹 될 것이다 . f2와 f4도 마찬가지입니다.

정적 잠금의 경우 클래스에 여러 정적 메서드가 있고 클래스 잠금 대신 해당 메서드에 대한 개별 잠금을 원할 경우 여러 개의 정적 잠금이 필요합니다. 그리고 이러한 잠금은 어떤 방법이 차단 될지 결정할 것입니다.

이 시점까지 모든 것이 좋습니다. 이제이 정적 잠금을 인스턴스 메서드에 넣으면 동일한 객체의 두 스레드가 해당 메서드에 액세스하려고 할 때 어떤 일이 발생합니까?

+3

"_ 할 일은 ... _"이 작업을 수행하고 실행하고 결과를 확인하는 코드를 작성하는 것이 좋습니다. – csmckelvey

+0

정적 객체는 일반 객체이며 동작은 "인스턴스"에 고정 된 것과 동일합니다 .- 객체 – JohnnyAW

답변

4

staticsynchronize이있는 경우 인스턴스 메서드를 잠그면 사용중인 개체의 인스턴스에 관계없이 해당 잠금에 의해 제어되는 중요 섹션을 입력 할 수 있습니다.

당신이 lock1 정적, 단 하나의 스레드 시스템 전체는 클래스 X의 인스턴스의 수백을 만들 경우에도 f1 또는 f3 실행할 수있을 것 한 경우, 잠 된 개체를 포함하여 모든 static 회원 있기 때문에, 모든 공유됩니다 클래스의 인스턴스.

0

모든 상황 (lock1, lock2)은 항상 동시에 발생 시키십시오. 또한 잠금, 정적 컨텍스트에 대한 코드 블록을 동기화하는 경우 한 번에 하나의 스레드 만 통과 할 수 있습니다. 따라서 두 스레드 중 하나는 다른 스레드가 완료 될 때까지 차단됩니다.

관련 문제