안녕하세요, 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;
}
나는 동기화 된 코드 블록을 가지고 있지 라운드 어쨌든 표시되지 않는 이유는 무엇입니까?
감사
실제 질문은 여기에 무엇입니까? 잠금 장치없이이 작업을 수행 할 수있는 방법이 있는지 묻고 있습니까? –
예 - 제 질문은 동기화 된 코드 블록이 없어도 스레드 안전을 유지할 수 있습니까? 덕분에 – Pat
"x를 동기화해야합니까?"라는 질문에 대한 대답은? "1 단계 이상의 개별 단계가 필요한 상태 변환을 수행하는 변경 가능한 객체가 있습니까?"라는 대답과 동일합니다. 그렇지 않으면 스레드가 경쟁 상태를 일으키거나 유효하지 않은 상태, 일시적 상태 및/또는 불일치 상태 인 지점에서 개체를 볼 수 있습니다. 변경 가능한 객체가 자체 내부 동기화를 제공하는 경우에는 예외가 발생합니다. 당신의 상태 천이는 하나 이상의 단계를 필요로하는 것처럼 보입니다. 따라서 .... – scottb