인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

hylim님의 프로필 이미지

작성한 질문수

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

동기화와 CPU 관계

동기화가 보장된다고 하더라도 스레드간 데이터 불일치가 발생할 수 있지 않나요??

작성

·

137

0

강의 잘 듣고 있습니다.

질문 드릴 것이, 동기화가 보장되어서 각 스레드 별로 원자적으로 연산을 한다고 하더라도 CPU 레지스터에서 이루어지는 연산이기 때문에 메모리에 바로 적용되지는 않는거 아닌가요?

 

동기화 매커니즘과 동시에 atomic 혹은 volatile 을 선언해야 하는 거 아닌가요??

답변 2

1

정수원님의 프로필 이미지
정수원
지식공유자

동기화 자체가 이미 atomic 나 volatile 의 기능을 다 포함하고 있습니다.

예를 들어 synchronized 키워드를 선언하게 되면 해당 블록안에서는 동기화를 보장합니다. 그래서 굳이 atomic 나 volatile 를 선언할 필요가 없습니다.

그리고 메모리에 바로 적용되는 부분도 synchronized 키워드를 사용하면 강제적으로 메모리에 적용되도록 하고 있습니다.

물론 동기화가 자체가 100퍼센트 완벽하다고 볼수는 없습니다.

전반적인 강의를 모두 들으시면 좀 더 이해가 수월해 질 수 있습니다.

hylim님의 프로필 이미지
hylim
질문자

자세한 답변 감사드립니다!

0

인프런 AI 인턴님의 프로필 이미지

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

hylim님의 질문에 대해 답변드리겠습니다.

스레드 동기화는 주로 여러 스레드가 같은 자원에 동시에 접근하는 상황에서 데이터 일관성을 유지하기 위해 사용됩니다. 동기화가 보장될 경우 각 스레드는 정의된 순서에 따라 자원에 접근하지만, 모든 데이터 일관성 문제가 해결되지는 않을 수 있습니다. 이것은 CPU의 캐시와 메모리 간의 데이터 전파 타이밍이 엇갈릴 가능성이 있기 때문입니다.

이때 atomic 클래스나 volatile 키워드를 사용하면 메모리 일관성을 어느 정도 보장할 수 있습니다. volatile은 변수의 상태를 모든 스레드에게 즉시 반영하도록 보장하여, 캐시에 저장된 값 대신 메모리의 값을 읽어오도록 합니다. 반면, Atomic 클래스들은 무거운 동기화를 사용하지 않고도 동시성을 관리할 수 있는 방법을 제공합니다.

따라서 다양한 스레드 간의 데이터 불일치를 방지하기 위해서는 동기화와 함께 적절한 데이터 일관성을 유지할 수 있는 메커니즘(예: Volatile, Atomic)을 사용하는 것이 좋습니다. 특히, 동시성 문제가 발생할 수 있는 주기적인 데이터 변화를 확실하게 반영해야 하는 경우는 이러한 기법을 적절히 결합하여 사용해야 합니다.

이와 관련된 추가적인 자료를 참조하실 수 있는 링크는 다음과 같습니다:
- synchronized = 모니터: 모니터 락을 이해하는 데 도움이 됩니다.

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

hylim님의 프로필 이미지

작성한 질문수

질문하기