2013-08-25 2 views
2

안녕하세요, ConcurrentLinkedQueue를 사용하여 Java에서 이동 평균 창 (MAW) 데이터 구조를 만들고 있습니다. MAW는 동시에 여러 스레드에서 호출 할 수 있으므로 코드가 스레드 안전하다는 것을 확인해야합니다.이 작업을 수행 할 수있는 유일한 방법은 (잠금을 대기열로 사용하는) 동기화 된 코드 블록을 추가하는 것입니다 방법 :대기열을 사용하는 Java의 동시 이동 평균 창?

final Queue<Double> myQ = new ConcurrentLinkedQueue<Double>(); 
volatile double total; 
volatile int count; 

추가 방법에있어서 나는이 :

synchronized (myQ) 
{ 
    if (myQ.offer(value)) 
    { 
     total += value; 
     count++; 
    } 
    if (size > window) 
    { 
     total -= myQ.poll(); 
     count--; 
    } 
    movingAvg = total/count; 
} 

나는 동기화 된 코드 블록을 가지고 있지 라운드 어쨌든 표시되지 않는 이유는 무엇입니까?

감사

+0

실제 질문은 여기에 무엇입니까? 잠금 장치없이이 작업을 수행 할 수있는 방법이 있는지 묻고 있습니까? –

+0

예 - 제 질문은 동기화 된 코드 블록이 없어도 스레드 안전을 유지할 수 있습니까? 덕분에 – Pat

+0

"x를 동기화해야합니까?"라는 질문에 대한 대답은? "1 단계 이상의 개별 단계가 필요한 상태 변환을 수행하는 변경 가능한 객체가 있습니까?"라는 대답과 동일합니다. 그렇지 않으면 스레드가 경쟁 상태를 일으키거나 유효하지 않은 상태, 일시적 상태 및/또는 불일치 상태 인 지점에서 개체를 볼 수 있습니다. 변경 가능한 객체가 자체 내부 동기화를 제공하는 경우에는 예외가 발생합니다. 당신의 상태 천이는 하나 이상의 단계를 필요로하는 것처럼 보입니다. 따라서 .... – scottb

답변

4

당신이 약간 잘못된 값을 받고으로 확인하지 않는 한 나는 방법을 생각할 수 없다. 한편

, 가장 성능 의식 구현 중 하나는 너무 잠금 ( the metrics library)를 사용합니다.

잠금 획득은 JDK6 이후 매우 빠른 얻었다. 내가 너라면 나 그냥 자물쇠를 쓸거야.

+1

배열에서 동기화를 사용하여 큐를 복잡하게 만드는 것보다 훨씬 간단한 흥미로운 구현입니다. –

+0

멋진데, 링크 덕분입니다. – Pat