나는 각 스레드가이 ArrayList 'X'addAll()을 사용하여 더 많은 데이터를 추가하는 여러 스레드에 전달되는 ArrayList 'X'를 가지고 있습니다. 분명히 여기에 멀티 스레딩 문제가 있습니다. 한 옵션은 코드의 addAll() 부분을 'synchronized'(또는) copyOnWriteArrayList를 사용하는 것입니다.스레드 안전성이 휘발성을 보장합니까? 이 ArrayList 예제
하지만 내 질문은이 ArrayList 'volatile'을 선언하면 같은 목적을 달성 할 수 있습니까? JVM은 이러한 읽기/쓰기 명령어를 적절하게 정렬하고 멀티 스레딩 문제를 방지합니까?
아니요, 휘발성은 액세스를 동기화하지 않습니다. 즉, '동기화 된'(또는 다른 잠금)이 무엇인지에 대한 것입니다. – tkausl
휘발성은 여기 당신을 도울 수 없습니다. 휘발성은 목록의 내용이 아니라 참조를 의미합니다. 'synchronized'를 사용하여 목록을 잠 그거나 각 스레드가 (가능한 경우) 자체 목록을 유지하고 처리가 끝나면 목록을 함께 결합해야합니다. –
http://shipilev.net/blog/2016/close-encounters-of-jmm-kind/#_pitfall_adding_volatiles_closer_to_the_problem_helps (시간이 있다면 전체 기사)를 읽는 것이 좋습니다. – C4stor