2014-10-06 6 views
0

단순한 시나리오는 LongAdders 배열이 있고 주어진 인덱스에서 변수를 증가시키기 위해 여러 스레드가이 배열에 액세스하고 있다는 것입니다.LongAdder [] + System.arraycopy() =?

추가 잠금 메커니즘없이 arraycopy해도 안전한가요?

LongAdder의 모든 중요한 필드가 휘발성이며 설명 increment()로 인해 원자가되어야하므로이 항목을 조사해 보았습니다. (그 부분 상태를 유지하지 않기를 바랍니다. 향후 작업에서 문제가 될 수 있음).

누구든지 확인할 수 있습니까?

P. 가장 최근의 스냅 샷 (복사 중 증가분)을 얻지 못할 수도 있다는 것을 알고 있지만 괜찮습니다.

답변

1

LongAdder 배열은 참조 만 포함하므로 복사됩니다. LongAdder 내의 필드는 해당 필드와 관련이 없습니다.

arraycopy을 사용하는 것이 안전한지 여부에 달려 있습니다. 하나의 어레이를 다른 어레이로 복사하는 데 사용하는 경우에는 그 자체로 문제가 될 수 있습니다. 배열은 스레드에서도 볼 수 있습니다.) 배열의 한 부분을 동일한 배열의 다른 부분에 복사하는 경우 동일한 인덱스에서 여러 스레드가 읽고 다른 참조를 얻을 가능성을 고려해야합니다.

+0

감사합니다. 나는이 부분을 잊어 버렸고 실제로 참조를 쓰지 않고 객체를 복사한다는 관점에서 생각하고있었습니다. – zerocool