# 동시성 문제 중 경쟁 상태를 해결하려면

# 경쟁 상태

  • 두 개 이상의 스레드가 공유 자원에 동시에 접근할 때 스레드의 실행 순서에 따라 결과가 달라지는 현상
  • 원자성과 가시성이 모두 보장되어야 함

# 원자성

  • 특정 작업 사이에 다른 스레드가 끼어들지 않고 한번에 실행되는 현상
  • 만약 Thread1에서 i+1을 수행할 때 동시에 Thread2에서 i를 읽어서 i+1을 수행하면 한 연산이 무시될 수 있음

# 가시성

  • 현대 컴퓨터는 여러 개의 CPU 코어가 있고, 각 코어마다 CPU 캐시가 존재
  • 한 스레드에서 공유 자원을 변경할 경우, 메인 메모리에서 CPU 캐시로 값을 읽어들인 후, 변경된 값을 자신의 CPU 캐시에 반영
  • 즉, 변경된 값이 바로 메인 메모리에 반영되지 않기 때문에, 다른 스레드가 공유 자원을 읽을 때 변경사항을 즉시 확인할 수 없음

# 자바에서 원자성과 가시성을 보장하려면?

# 원자성과 가시성을 모두 보장하려면

  • synchronized
  • atomic 클래스 (Compare-And-Swap)
  • ReentrantLock과 같은 lock 클래스
  • Concurrent Collections 등을 사용해 동기화 가능

# 가시성만 보장하려면

  • volatile 키워드로 CPU 캐시를 사용하지 않고 메인 메모리에서 공유 자원을 읽을 수 있음
  • 이때 하나의 스레드에서만 쓰기 작업을 수행하고, 나머지 스레드는 읽기 작업만 수행해야 함