문득 ArrayList 에 대해 궁금해졌습니다.
324
작성한 질문수 42
[질문 내용]
안녕하세요!
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
감사합니다.
0
그러면 static 한List 또는 Map을 여러사용자가 동시에 사용하는 경우에 필요한것인데 (또는 동시에 공유)
이런 경우가 대체 실무에서 어떤 경우가 있는지 궁금합니다!!
0
꼭 static이 아니라 싱글톤이 가지고 있는 모든 필드가 문제가 될 수 있습니다.
스프링의 경우 싱글톤을 사용하니까요.
예를 들어서 실무에서 성능 최적화를 위해 DB가 아니라 메모리에 어떤 정보를 보관한다고 가정하겠습니다. 이때 static HashMap에 어떤 데이터를 보관하고 돌려준다면 동시성 이슈가 발생할 수 있습니다.
다음 예시도 참고해주세요.
https://d2.naver.com/helloworld/1326256
감사합니다.
강의 관련 외 질문입니다.
0
66
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
0
89
1
BeanCreationException
0
87
3
Update 후 UpdateMemberResponse 매핑할 때
0
47
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
99
2
페이징 + 검색조건 관련해서 질문드립니다.
0
70
1
Query Dsl Q파일 질문입니다.
0
82
1
루트 쿼리라는것은
0
58
1
메서드를 분리하는 기준
0
63
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
110
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
84
2
fetch join과 영속화와 OSIV의 관계
0
85
2
Distinct 사용 전 결과에 대한 의문
0
113
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
57
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
78
2
dto 필드 속 엔티티 여부
0
60
1
뷰템플릿 사용 시
0
76
2
Result 클래스 관련 질문
0
56
1
@PostConstruct 프록시 관련 질문드립니다
0
86
1
DTO 대신 Form 사용은 안되나요?
0
135
1
OSIV ON 상태일 때
0
96
1
fetch join VS fetch join 페이징 궁금증
0
180
2
양방향 연관관계 알아보는 법?
0
105
1
16강 17강 간단 정리 이게 맞을까요 ?
0
165
2





