inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

채널톡 면접관이 직접 알려주는 CS 면접 대비 - Java 편

자바의 동시성 이슈를 해결하는 방법을 설명해주세요. ⭐️⭐️⭐️

질문있습니다.

해결된 질문

91

조성우

작성한 질문수 1

1

동시성 이슈에 발생할 수 있는 상황에서,

A 변수에 대해 읽기 작업만 수행하는 코드(가시성 문제가 있을 수 있는 코드)에서는 volatile을 고려해볼 수 있고, A 변수에 대해 읽기 + 쓰기 작업도 있는 경우에는 synchronized와 atomic을 고려해볼 수 있겠네요.

 

제가 이해한 게 맞을까요?

java 객체지향 computer-science

답변 2

1

JSCODE 제이온

안녕하세요, 조성우님!

큰 그림은 맞게 이해하셨어요. 다만 한 가지 디테일을 추가로 알아 주셔야 합니다.

 

기본 분류는 말씀하신 그대로입니다.

  • 읽기만 수행 (가시성만 보장하면 충분): volatile

  • 읽기 + 쓰기 (원자성도 필요): synchronized 또는 Atomic

 

다만 알아두시면 좋은 점은, synchronized는 원자성뿐 아니라 가시성 문제도 함께 해결한다는 점이에요. 자바 메모리 모델(JMM)이 락 획득/해제 시점에 다음을 보장하기 때문입니다.

 

  • 락 획득 (synchronized 진입): CPU 캐시를 무효화하고 메인 메모리에서 최신 값을 다시 읽어옴

  • 락 해제 (synchronized 종료): 변경된 값을 메인 메모리로 flush

     

 

즉 synchronized 블록에 진입하거나 빠져나갈 때마다 메모리 배리어가 동작해서 가시성이 자연스럽게 보장됩니다. Atomic 클래스들도 내부적으로 volatile 변수와 CAS 연산을 사용하기 때문에 마찬가지로 가시성을 함께 보장하고요.

 

정리하면 이렇습니다.

  • 가시성만 필요할 때volatile (가장 가볍고 성능 좋음)

  • 원자성도 필요할 때synchronized 또는 Atomic (둘 다 가시성도 자동 해결)

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 조성우님!

동시성 이슈에서 변수를 읽고 쓸 때 고려해야 할 원칙은 중요합니다. 조성우님의 이해는 적절한 방향입니다만, 각각의 기술의 특징을 좀 더 명확히 이해할 수 있으면 좋겠습니다.

  1. volatile: volatile 키워드는 변수의 가시성을 보장하기 위해 사용됩니다. 이는 여러 스레드가 변수의 최신 값을 항상 보고해야 할 때 유용합니다. 다만 volatile원자적 연산(atomic operation)을 보장하지 않기 때문에 읽기와 쓰기가 함께 있는 경우 적절치 않을 수 있습니다.

  2. synchronized: synchronized 블록이나 메서드는 경쟁 조건(race condition)을 방지하며, 변수가 여러 스레드에 의해 동시에 읽기 및 쓰기가 이뤄질 때 쓰입니다. 이는 단일 진입점(mutex)를 통해 동기화된 접근을 제공합니다.

  3. atomic: Java에서 제공하는 atomic 패키지는 원자적 연산을 지원하여, 멀티스레드 환경에서의 읽기와 쓰기 동시 작업을 더욱 안전하게 처리합니다. 이러한 클래스들(AtomicInteger, AtomicLong 등)은 lock을 사용하지 않으면서도 원자성을 보장합니다.

따라서, A 변수에 대해 단순 읽기라면 volatile을 고려하고, 읽기와 쓰기가 모두 있다면 synchronizedatomic을 고려하는 것이 맞습니다.

관련하여 유사한 질문의 답변을 찾고자 하신다면, volatile에 대한 설명 과 같은 게시물을 참고하시면 도움이 될 수 있습니다.

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

실습환경(비쥬얼스튜디오)에 대한 질문입니다.

0

11

1

리프레시 토큰

1

12

1

섹션2, 대화&세션관리 수업 자료 누락

0

19

2

영상 다운로드는 안되나요?

0

20

1

IntelliJ IDEA 체험 만료

0

25

1

부하 테스트 시 설정 관련 질문드립니다

1

42

1

HelloSpringApplication.java 클래스 실행 오류

0

21

1

build 시 에러 해결방법 공유(docker.desktop 업데이트 -> 의존성 버전 수정)

0

42

2

예외처리 3강 문의

0

42

1

챌린지 시작일 문의

0

43

0

26년2회 실기기출은 언제쯤...

0

64

2

네이버 API | '검색 - 책' API 제공 중단

0

51

2

ArticleReadService 관련 질문

0

33

1

kafka 이벤트 발행 실패 시 at-least-once를 보장하는 방법이 궁금합니다.

1

78

1

이론 공부법 요약본 버전 업데이트 문의

0

47

2

domain에 @Entity 와 Repository를 함께 둔 이유가 궁금합니다

1

67

1

멀티스레드

1

86

2

성능 오버헤드

1

83

2

volatile에 대해 질문 있습니다.

2

118

2

Mark and Sweep

1

85

1

GC 알고리즘

1

89

2

용어 질문

1

60

1

호출횟수 질문입니다.

1

95

2

실행과정 질문입니다.

2

82

1