경쟁 상태 : 두 개 이상의 스레드가 공유 자원에 동시에 접근할 때 스레드 간의 실행 순서에 따라 결과가 달라지는 현상
원자성과 가시성 모두 보장되어야 해결할 수 있다.
원자성 : 공유 자원에 대한 작업의 단위가 더 이상 쪼갤 수 없는 하나의 연산처럼 동작하는 성질
가시성 : 한 스레드에서 변경한 값이 다른 스레드에서 즉시 확인 가능한 성질
원자성을 보장하지 않으면 어떤 문제가 발생하나요?
예를 들어, i++연산은 하나의 문장이지만, CPU가 이를 수행하려면 세 단계의 instruction으로 분리된다.
1) i변수의 기존 값을 읽음(Read)
2) 기존 값에 1을 더함(Modify)
3) 결과 값을 다시 i변수에 저장(Write)
> 읽고 더하고 저장하고
연산 사이에 다른 스레드가 개입하면 기대하지 않은 결과발생할 수 있다.
만약 두 개의 스레드가 동시에 i++연산을 수행할 때 Thread1 이 i+1을 하기 전에 Thread2가 i를 읽어서 i + 1을 수행한 후 반영하면 Thread2의 연산은 무시된다.
가시성을 보장하지 않으면 어떤 문제가 발생하나요?
현대의 컴퓨터는 여러 개의 CPU 코어가 있고 각 코어마다 CPU 캐시가 존재한다. 한 스레드에서 공유자원을 변경할 경우 메인 메모리에서 CPU캐시로 값을 읽어들인 후, 변경된 값을 자신의 CPU캐시에 반영한다.
하지만 변결된 값이 메인 메모리에 언제 반영될지 알 수 없어서 다른 스레드가 공유 자ㅝ을 째 변경 사항을 즉시 확인할 수 없다.
java에서 원자성과 가시성을 보장하기 위해 어떤 방법을 사용할 수 있나?
원자성과 가시성을 모두 보장하려면 sychronizd키워드, CAS알고리즘을 사용하는 Atomic클래스, ReentrantLock과 같은 lock클래스, Concurrent Collentcions등을 사용해서 동기화할 수 있다.
가시성만 보장하려면 volatile키워드로 CPU캐시를 사용하지 않고 메인 메모리에서 공유 자원을 직접 읽거나 쓸 수 있다. 이때 하나의 스레드에서만 쓰기 작업을 수행하고, 나머지 스레드는 읽기 작업만 수행해야 한다.
'cs(with 매일메일)' 카테고리의 다른 글
| [260114수] CDN이란 무엇인가요? (0) | 2026.01.23 |
|---|---|
| [260113화] 스프링 트랜잭션 전파 속성에 대해서 설명해주세요. (0) | 2026.01.23 |
| [260109금] DNS란 무엇인가요? (0) | 2026.01.19 |
| [260108목] 연속 메모리 할당 기법에 대해서 설명해주세요. (0) | 2026.01.19 |
| [260107수] 자바에서 클래스 정보는 어떻게 알아낼 수 있나요? (1) | 2026.01.19 |