위 코드에서는 스레드로부터 안전하지 않은 ArrayList가 메인 스레드에 새로 추가되고, 이 ArrayList에 요소를 각각 추가하기 위해 1000개의 스레드가 열립니다. 모든 스레드가 완료된 후 이 What입니다. ArrayList의 크기여야 합니까? 100,000이어야합니까?
단, 실제 실행 결과는 100000이 아닐 수도 있습니다! 결과는 99946, 99955...일 수 있습니다. 이것이 다중 스레드 작업의 경우 스레드로부터 안전하지 않은 컬렉션이 잘못된 결과를 초래하는 이유입니다.
특정 스레드 안전에 대해서는 제가 작성한 블로그인 http://xxgblog.com/2013/05/16/java-threa...를 참조하세요.
먼저 코드를 드리겠습니다. 직접 실행해 보시기 바랍니다.
으아악위 코드에서는 스레드로부터 안전하지 않은 ArrayList가 메인 스레드에 새로 추가되고, 이 ArrayList에 요소를 각각 추가하기 위해 1000개의 스레드가 열립니다. 모든 스레드가 완료된 후 이 What입니다. ArrayList의 크기여야 합니까? 100,000이어야합니까?
단, 실제 실행 결과는 100000이 아닐 수도 있습니다! 결과는 99946, 99955...일 수 있습니다. 이것이 다중 스레드 작업의 경우 스레드로부터 안전하지 않은 컬렉션이 잘못된 결과를 초래하는 이유입니다.
특정 스레드 안전에 대해서는 제가 작성한 블로그인 http://xxgblog.com/2013/05/16/java-threa...를 참조하세요.
이로 인해 데이터 불일치가 발생하고 얻은 데이터가 부정확할 수 있습니다. 그 영향은 전적으로 비즈니스 로직에 따라 결정됩니다.
예를 들어 스레드 A가 목록을 순회하고 있습니다
으아악순회 프로세스 중에 스레드 B가 와서 목록에서 요소를 삭제합니다. 그런 다음 스레드 A는 순회가 끝나면 IndexOutOfBoundsException이 표시됩니다. 왜냐하면 실제 요소 수가 최대 1개가 되었기 때문입니다.