인턴 근무를 할 때 팀에서 사용하던 페이징을 하는 ItemReader 가 AbstractPagingItemReader 를 구현하지 않았었던 것을 발견했습니다. AbstractPagingItemReader 를 구현하도록 개선하기 위해 이를 구현한 다른 클래스를 참고하던 중 CopyOnWriteArrayList 를 사용하는 것을 봤습니다. 이것에 대해서 정리해보려 합니다.
AbstractPagingItemReader
를 살펴보면 synchronized 를 통해서 상태값들에 접근하는 코드에 대해서 동기화를 해주고 있습니다. 이것으로 충분할까요?
위 코드는 JpaPagingItemReader
의 doReadPage 메서드 일부입니다. results 를 보면 CopyOnWriteArrayList 인 것을 볼 수 있는데요.
AbstractPagingItemReader 에서 results 는 읽어들인 데이터, item 들이 담기는 리스트입니다. 이는 여러 스레드에서 접근되기 때문에 쓰레드에 안전하지 않은 ArrayList가 아니라 쓰레드에 안전한 CopyOnWriteArrayList 를 사용해야 합니다.