2017-04-24 4 views
1

온라인 자습서를 기반으로, 나는 아래의 보안 코드를 사용했습니다.Java의 가드드 서스펜션

public synchronized String method1() throws InterruptedException { 
    lock = true;    

     Thread.sleep(17000); 
     lock = false; 
     notifyAll();  

    return "Method1"; 
} 

public synchronized String method2() throws InterruptedException { 

     while(lock) {   
      wait();  
     }   
     Thread.sleep(3000);  

    return "From Method 2"; 
} 

위의 두 메서드는 여러 스레드에서 동시에 호출됩니다.

위의 예에서 wait()의 사전 조건에 사용 된 잠금 변수가 true일까요?

synchronized 키워드를 사용하므로 두 방법 모두 상호 배타적으로 실행됩니다.

위의 예는 경비 서스펜션에 맞습니까?

언제 경비 서스펜션이 필요합니까?

답변

0

한 번에 하나의 스레드 만이 아니라있어서 개질제 synchronized을 갖는 단일 인스턴스에 임의의 방법을 실행하는 것을 보장 않는 인스턴스 메소드에서 사용 자바 키워드 synchronized. 더 정확한 : 어떤 방법이 아니라 어떤 자원/데이터에 대해서도 모니터 또는 세마포어 상호 배타적 액세스 제어와 같은 인스턴스를 사용합니다.

예제에서 두 인스턴스 메서드 모두 수정 자 synchronized을 가지므로 주어진 시간에 하나의 스레드 만 해당 메서드 내에서 코드를 실행하도록합니다.

변수 locktrue으로 설정하는 동일한 방법으로 false으로 다시 변경되기 때문에 귀하의 예에서는 유용하지 않습니다. 따라서 method2locktrue이되도록 관찰하지 않습니다.

두 개 이상의 스레드가 변경 가능한 리소스에서 작동해야하며 두 스레드가 읽기/작동 상태에서 일치해야 할 때마다이 리소스를 경쟁 조건 (동시에 읽거나 수정)으로부터 보호해야합니다. 그렇지 않으면 단일 스레드에 의해 실행될 경우 결과가 다를 수 있습니다.

0

동일한 방법으로 lock = true;lock = flase;을 수행 중이므로 구현이 잘못되었다고 생각합니다. 제 생각에는

, 그것은

public synchronized String method1() throws InterruptedException {   
     Thread.sleep(17000); 
     lock = false; 
     notifyAll();  

    return "Method1"; 
} 

public synchronized String method2() throws InterruptedException { 

     while(lock) {   
      wait();  
     }   
     Thread.sleep(3000); 
     lock = true; 

    return "From Method 2"; 
} 

당신은 지키고 서스펜션 당신이 전제 조건도 만족해야하는 상황이있을 때 패턴임을 이해해야한다, 아래와 같이 수행해야합니다 또한 동기화 잠금을 사용할 수 있습니다.

thread-safe 블로킹 큐를 구현할 때 사용할 수있는 아이템이 없다면 메소드 스레드를 대기 상태로두고 큐가 가득 차면 대기 상태의 메소드 스레드를 put에 놓아야합니다. 따라서이 요구 사항은 동기화 된 액세스 즉, 큐가 상호 배타적 인 방식으로 액세스되어야합니다 (기본 요구 사항이므로 synchronized을 메소드 서명에 넣습니다). 그러나 큐가 적절한 상태 (선행 조건 변수를 확인하여)가 아닌 경우, 너는 wait 또는 notify 등을한다.

Object.wait()Thread.sleep(...)이 동기화 잠금을 해제하지 않는다는 사실을 명심해야합니다.

실례를 들자면 (thread-safe 블로킹 큐처럼) 구현이 올바른지 아닌지를 알 수 있습니다. 구현이 맞는지 아닌지를 알 수 있습니다 (lock은이 패턴의 일반적인 구현이 없으므로 동일한 메소드에서 설정/재설정하면 안됩니다.

Refer This

는 희망이 도움이!