2014-12-23 2 views
-1

Java ZK 응용 프로그램의 ViewModel에서 특정 함수를 실행하는 스레드가 여러 개 있습니다. 처음에는 함수가 어떤 스레드에 의해 실행될 때까지 오랜 시간이 걸리지 만 한 번 실행 된 후에는 다른 스레드에 의해 실행될 때 즉시 반환됩니다. 하지만 처음에는 단 한 개의 스레드 만 실행해야합니다. 여러 스레드가 해당 함수를 실행하는 것처럼 여러 함수가 동일한 함수를 호출 할 때 캐시가 비어있는 상태로 반환되지 않으므로 반환 시간이 합산됩니다 그들 모두를 위해서. 그럼 다른 스레드가 스레드가 다른 개체에 속해 있고 여기에서 메서드를 동기화하면 여기에서 작동하지 않으므로 첫 번째 스레드가 완료 될 때까지 기다릴 수 있습니다. 첫 번째 스레드가 완료 한 다른 스레드와 통신 할 수있는 변수를 여기서 사용할 수 있습니까? 모든 스레드는 동일한 클래스의 다른 객체, 즉 ViewModel에 속하며 스레드 클래스를 확장하거나 ZK 프레임 워크 클래스이므로 Runnable을 구현할 수 없습니다. 모든 해결책을 제안 할 수 있습니다. 이 같은다른 스레드가 실행될 때까지 스레드가 대기합니다.

+0

캐시 값을 동기화 할 수 있습니다. –

답변

2

뭔가 :

static Object lock; 

... 

if (objectYouAreHopingHasBeenCached == null) { 
    synchronized (lock) { 
    if (objectYouAreHopingHasBeenCached == null) { 
     // fetch the object, put in in objectYouAreHopingHasBeenCached 
    } 
    } 
} 
return objectYouAreHopingHasBeenCached; 
+0

이것은 대부분의 경우 작동하지만 항상 그런 것은 아닙니다. 두 번째 스레드는 첫 번째 스레드가 수행 한 직후 'objectYouAreHopingHasBeenCached'를 null과 비교할 수 있지만 첫 번째 스레드가 잠금을 획득하기 직전과 비교할 수 있습니다. – Hoopje

+0

이 때문에 동기화 된 블록에서 개체를 다시 확인합니다. 그런 식으로, 당신은 두 세계의 장점을 가질 수 있습니다. - 한번만 가져 왔는지 확인하십시오. 그러나 동기화 된 블록이 이미 있다면 거기에 – ControlAltDel

+0

이중 잠금이 Java 5 +에서 수정되어 필드가 * ** 휘발성 **이 경우 클래스 선언 :'private volatile Object objectYouAreHopingHasBeenCached; ' – dkatzel