2009-09-04 4 views
1

Java 6 또는 7을 사용하여 배열 자체에서 동기화하지 않고 여러 스레드에서 바이트 배열을 안전하게 채울 수 있습니까 (예 : 첫 번째 스레드가 처음 절반을 채우고 두 번째 스레드가 System.arraycopy를 사용하여 후반부를 채 웁니다.)? jsr166 관련 라이브러리에는 int 배열 (AtomicIntegerArray, ParallelIntegerArray) 만 있습니다.여러 스레드에서 바이트 배열을 안전하게 채우는 방법은 무엇입니까?

+0

이 질문에 감사드립니다. 필자는 배열 다중 스레드를 읽고 쓰는 것을 생각하지 않았습니다. 이것은 확실히 나의 서버 측 세계 발전기 및 가공업자에 도움이 될 것이다! 클라이언트의 초기 로딩시 이미지 상태 계산을 나눌 수도 있습니다! 나는 평평한 배열을 다차원 적으로 이미 속도로 사용하고 있지만,이 ^. ^. – Underbalanced

답변

6

예. 작동합니다. 배열 위치에 쓰기가 인근 위치를 방해하지 않습니다. 그러나 읽기 전에 모든 스레드가 완료되었는지 확인해야합니다 (happen-before 관계). 배열을 사용한다는 사실은 아무런 효과가 없습니다.

+0

예, 조인은 Future.get() 형식으로되어 있습니다. 캐시 정렬이 걱정됩니다. 예를 들어 4096 + 4096으로 작성된 [8192] 배열은 문제없이 작동하지만 4095 + 4097은 그렇지 않을 수 있습니다. – akarnokd

+0

적어도 MD5 데이터는 항상 동일하게 유지됩니다. 고맙습니다. – akarnokd

+0

이렇게하면 비 원자 바이트 연산을 사용하여 바이트를 쓰는 것과 비교하여 단일 스레드 액세스에서는 Java 바이트 배열이 상당히 느립니 까? 제 말은, JIT 또는 arraycopy 구현이 루프 밖에서 검사하는 경계를 이동했다는 가정하에 말입니다. –

0

오, 두통을 일으키는 좋은 방법 인 것 같습니다. :) 스레드 당 하나의 배열로 이동하고 나중에 그들을 가입 할 것 같아요.

+0

나는 그 선택권을 시도하고 나는 불만족했다. 다중 스레드 옵션을 사용하려고합니다. – akarnokd

+1

하지만 내 제안은 스레딩을 유지해야했지만 충돌을 피하기 위해 스레드 당 하나의 배열 만 가져야했습니다. 당신의 불만의 원인은 무엇입니까? 공연? – crunchdog

관련 문제