• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

문득 ArrayList 에 대해 궁금해졌습니다.

24.04.07 01:18 작성 조회수 83

0


[질문 내용]
안녕하세요!

ArrayList 에 대해 이것저것 찾아보던 중 이런 내용이 있었습니다.

ArrayList,Map 은 동시성 이슈가 있어 ArrayList 대신 CopyOnWriteArrayList를 Map 대신 ConCurrentHashMap 을 쓰라는 내용이었습니다.

 

이에 대해 실제 스프링으로 개발할 때 위 내용이 어떻게 응용되는지 이해가 안되고 찾지 못해서 질문드립니다.

 

뭐 단순히 ArrayList 에 정수 넣고 실험해서 동시성 이슈가 있다라고 파악을 한다고 치더라도 뭐 어느 경우에 적용해야 하는지 이해가 안갑니다.

 

질문 요약

1) ArrayList 대신 CopyOnWriteArrayList 를 써야 하는 실무적인 실제 예를 들어주세요! 지금까지 영한님한테 배웠던 대로 양방향 관계에서 List = new ArrayList<>로 초기화 해줬는데 그러면 이는 유저가 많은 멀티스레드 환경에서 위험한 것 아닌가요??

 

 public PostResponseDto showDetailsPost(final Long postId){
        //Post + PostImage + Post 게시글 작성자 함께 영속화
        Post post = findPostWithFetchMemberAndImage(postId);

        //첫 댓글 Reply (대댓글 X) + 부모댓글 작성자 함께 영속화
        List<Reply> parentReply = replyRepository.findParentReplyByPostIdWithFetchMember(postId);

        List<ReplyResponseDto> replyResponseDtoList = new ArrayList<>();

        //부모-> 자식 순으로 DTO 순서 저장.
        for(Reply parent: parentReply){

            replyResponseDtoList.add(ReplyResponseDto.of(parent,makeNickNameForReply(parent),makeContentsForReply(parent)));

위 코드는 List<ReplyResponseDto> 를 new ArrayList<>() 로 초기화 해서 add 로 넣어주는 부분이 있습니다.

이런 부분도 다 CopyOnWriteArrayList를 써야 하는 것인가요?

 

 

 

2) Map 도 마찬가지입니다. 실제 Map 대신 ConcurrentHashMap 을 써야 했던 실무적인 예를 들어주시면 감사하겠습니다.

 

 

 

 

 

 

 

답변 1

답변을 작성해보세요.

1

안녕하세요. dionisos198님

지역 변수는 동시성 이슈가 발생하지 않습니다.

같은 인스턴스의 필드나 멤버변수를 여러 쓰레드가 동시에 접근하는 경우에 동시성 이슈가 발생합니다.

이런 경우에 한정해서 ConcurrentHashMap 같은 것을 사용하면 됩니다.

예시로 적어주신 내용은 모두 지역 변수이기 때문에 동시성 이슈 자체가 발생하지 않습니다.

추가로 다음 내용도 읽어보시면 도움이 되실거에요.

https://www.inflearn.com/questions/347336

감사합니다.

그러면 static 한List 또는 Map을 여러사용자가 동시에 사용하는 경우에 필요한것인데 (또는 동시에 공유)

이런 경우가 대체 실무에서 어떤 경우가 있는지 궁금합니다!!

꼭 static이 아니라 싱글톤이 가지고 있는 모든 필드가 문제가 될 수 있습니다.

스프링의 경우 싱글톤을 사용하니까요.

예를 들어서 실무에서 성능 최적화를 위해 DB가 아니라 메모리에 어떤 정보를 보관한다고 가정하겠습니다. 이때 static HashMap에 어떤 데이터를 보관하고 돌려준다면 동시성 이슈가 발생할 수 있습니다.

다음 예시도 참고해주세요.

https://d2.naver.com/helloworld/1326256

감사합니다.