2013-09-16 2 views
1

(JSF 관리 Bean의 일부로) 조치 리스너가있는 클래스가 있습니다. 액션 리스너 내부의 코드는 다른 클래스의 새 객체를 생성합니다. 이 개체는이 클래스의 기능을 호출하기 위해 사용되는 클래스 A. .. 차례로리소스를 액세스하는 스레드가 1 개만 필요합니다.

public void invokeActionListener(ActionEvent act) 
{ 
MyClass myclass=new MyClass(); 
myclass.invokeRequest(); 
} 

invokeRequest 기능 일부 데이터가 함수 B를 다른 기능 C. C의 호출에 D를 호출하는 다른 함수 B를 호출하여 처리 한 후 및 흐름은 끝납니다 ..

invokeRequest가 D가 끝날 때까지 전체 흐름이 완료 될 때까지 한 번만 호출해야하는 경우를 원합니다.

function invokeRequest()에서 동기화하지만 동기화가 작동하지 않습니다. 다른 스레드는 1 개의 스레드가 여전히 작동 중일 때에도이 함수를 호출 할 수 있습니다.

Class MyClass 
{ 
public synchronized void invokeRequest() 
{ 
invokeRequestB(); 
} 

public void invokeRequestB() 
{ 
invoke RequestC(); 
} 

public void invokeRequestC() 
{ 
invoke RequestD(); 
} 

public void RequestD() 
{ 
//Complete processing and end the flow. 
} 

안내하시기 바랍니다 .....

답변

3

동기화 된 방법은 잠금에 대한 각각의 객체를 사용합니다. 개체에서 동기화 호출을 방지해야하는 경우 동기화 할 때 동일한 개체를 사용해야합니다. 동기화에 대한 정적 필드를 사용하는 한 가지 방법 :

Class MyClass { 
    private static final Object lock = new Object(); 

    public void invokeRequest() { 
     synchronized (lock) { 
      invokeRequestB(); 
     } 
    } 
    ... 
} 

아니면 모니터 개체로 MyClass.class 사용할 수 있습니다; 당신이 더 쉽게 읽을 수있는 것을 사용하십시오.

+0

하지만이 개체의 범위는 무엇입니까? Lock .. ??. 페이지의 단추를 한 번 클릭 할 때마다 MyClass의 새 개체를 만들고이 새 개체로 invokeRequest 함수를 호출합니다. 나는 새로운 객체가 Synchronize 블록에 입력 될 때마다 스레드가 어떤 잠금도 획득하지 못하기 때문에 그것을 이해했습니다. 하지만 정적 최종 객체를 사용하는 것이이 클래스의 유용한 목적 일 수 있습니다 ... 단서 없음 ... !! – AngelsandDemons

+0

모든 클래스 인스턴스가 정적 var 인스턴스를 공유합니다. 그래서 정적 변수는 "클래스 변수"라고도합니다. – Fildor

+0

@AngelsandDemons 예제 코드에서 호출은 개체 자체를 잠금에 사용하지만 클릭 할 때마다 새 호출이 만들어 지므로 많은 호출이 병렬로 실행될 수 있습니다. 정적 필드 (또는 클래스)를 사용하여 한 번에 하나의'invokeRequest()'만 실행하면 결과를 동기화 할 수 있습니다. * MyClass 인스턴스 *에서. (그것이 내가 원한 것으로 이해 한 것입니다. 그렇지 않다면 답을 삭제할 것입니다) – kiheru

관련 문제