강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

매콤한각설탕님의 프로필 이미지
매콤한각설탕

작성한 질문수

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

네트워크 프로그램6 - 자원 정리3

SessionManagerV6에서 동시성 컬렉션 사용

작성

·

129

0

public class SessionManagerV6 {
    private List<SessionV6> sessions = new CopyOnWriteArrayList<>();

    public void add(SessionV6 session) {
        sessions.add(session);
    }

    public void remove(SessionV6 session) {
        sessions.remove(session);
    }

    public void closeAll() {
        for (SessionV6 session : sessions) {
            session.close();
        }

        sessions.clear();
    }
}
  1. session들을 담는 List로, ArrayList 대신에 동시성 컬렉션인 CopyOnWriteArrayList을 사용하고, 각 메소드에서 synchronized 키워드를 제거하는 방식도 유효한가요?

  2. 만약 유효하다면, 기존 방식(synchronized )과 새 방식(동시성 컬렉션) 중 어느 방식을 언제 사용하는 것이 적절한가요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

CopyOnWriteArrayList를 사용하여 동시성 문제를 해결하고자 했군요. 이 컬렉션은 여러 스레드에서 동시에 안전하게 읽고 쓸 수 있도록 설계된 List입니다. 하지만, CopyOnWriteArrayList는 요소가 변경될 때마다 내부 배열을 복제하기 때문에 요소를 자주 추가하거나 삭제할 경우 성능에 큰 영향을 줄 수 있습니다. 그러므로 요소의 변화가 자주 발생하지 않는 경우에 적합합니다.

질문에 대한 답변:

  1. 유효한가요?

    • 네, CopyOnWriteArrayList를 사용하는 방식은 유효합니다. 이 경우, 각 작업이 자연스럽게 스레드 세이프(thread-safe)해지므로 synchronized 키워드를 제거해도 괜찮습니다.
  2. 어느 방식을 언제 사용하는 것이 적절한가요?

    • synchronized를 사용하는 경우: 리스트에 빈번히 쓰기 작업(추가, 삭제)이 일어날 때 적합합니다. synchronized는 리스트 전체에 락을 걸어 한 스레드만 작업을 수행할 수 있게 하므로 더 안정적인 성능을 보장할 수 있습니다.
    • CopyOnWriteArrayList를 사용하는 경우: 주로 읽기 작업이 많고, 쓰기 작업이 드물 때 사용합니다. 모든 쓰기 작업 시 리스트의 복사본을 생성하기에 쓰기 작업이 빈번하면 성능 저하가 발생할 수 있습니다.

이러한 설명이 도움이 되셨길 바라며, 관련하여 다양한 예제를 참고하시기를 권장 드립니다. 아래 링크는 동시성과 관련한 다른 질문들과 해결책을 제공하고 있어 도움이 될 것 같습니다:

  1. 세션에서 동시성 이슈가 발생할수 있다고 하셨는데

  2. ThreadLocal 동시성 이슈 (ArrayList, HashMap, HashSet)

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

매콤한각설탕님의 프로필 이미지
매콤한각설탕

작성한 질문수

질문하기