Java

Java volatile

오개발 2024. 11. 15. 16:12

java에서 volatile 키워드는 스레드들 사이에서 변수에 저장된 값을 변경하는 것에 대한 가시성을 보장합니다 여기서 가시성이란 최신 상태를 유지 하고 변경된 값을 즉시 읽을수 있도록 보장한다는 말이다. 

 

 

 

 

Using Cache in Multi CPUPermalink

  • 여러 개의 CPU를 사용하는 멀티 스레드 환경에서 데이터 동기화 문제가 발생합니다.
  • 각 CPU들이 각자의 스레드를 실행합니다.
  • 어플리케이션의 같은 변수를 사용하지만, CPU 캐시에 데이터를 로딩해서 사용합니다.

 

 

 

1.1. Data not matched between main memory and cpu cachePermalink

  • CPU1은 Thread1을 실행합니다.
  • CPU2는 Thread2를 실행합니다.
  • CPU1은 Thread1을 수행하면서 count 변수를 읽어 증가시키면서 작업을 수행합니다.
  • CPU2는 Thread2를 수행하면서 값의 변경은 없이 사용합니다.
  • 같은 변수를 다른 값으로 사용하게 되면서 로직 상의 문제가 발생합니다.

 

 

1.2. Synchronize in Multi Thread EnvironmentPermalink

위와 같은 문제를 해결하기 위해 volatile 키워드를 사용합니다. volatile 키워드를 사용하면 CPU 캐시가 아닌 메인 메모리에 저장된 데이터를 사용합니다. 데이터 불일치 문제는 해결할 수 있지만, 캐시를 사용하지 않는 만큼 성능이 떨어질 수 있습니다.

Java는 멀티 스레드 환경에서 스레드 안전한 프로그래밍을 위해 다음과 같은 기능들을 제공합니다.

  • synchronized
  • Atomic classes
  • volatile

synchronized 키워드나 Atomic 클래스는 동기화를 지원하지만, volatile 키워드는 가시성을 보장할 뿐 동기화를 지원하지 않습니다. 데이터 동기화를 위해선 synchronized 키워드나 Atomic 클래스를 함께 사용해야 합니다.

 

'Java' 카테고리의 다른 글

CompletableFuture에 대해서  (0) 2024.11.15
Java에서 dead lock이란 무엇인가요?  (0) 2024.11.14
ThreadLocal vs synchronized 차이점  (1) 2024.11.12
Monitor  (0) 2024.11.12
spinlock에 대해서  (0) 2024.11.12