FFFF Volatile · Issue #5 · daadaadaah/my-java · GitHub
[go: up one dir, main page]

Skip to content

Volatile #5

Open
Open

Description

@daadaadaah

Java volatile 이란?

  • 멀티 스레드 환경에서 메모리 가시성 문제를 해결하기 위해, java 변수에 CPU Cache가 아닌 Main Memory에 쓰고 읽어 오겠다라고 명시하는 것이다.
  • 기본적으로 어플리케이션에서는 Task를 수행하는 동안 성능상의 이유로 Main Memory에서 있는 변수 값을 CPU Cache에 저장하게 된다. (Main Memmory 보다 CPU Cache가 Access time 비용이 더 적게 든다.)
  • 이렇게 CPU Cache에 저장 방식이, 싱글 스레드 환경에서는 문제되지 않지 않지만, 멀티 스레드 환경에서 메모리 가시성 문제를 야기시킨다.
  • 이 문제를 해결하기 위해 사용되는 예약어가 volatile이다.

volatile 변수에 쓰기 작업을 할 때, 해당 스레드에 visible한 모든 non-volatile 변수들은 어떻게 되는가?

  • volatile 변수에 쓰기 작업을 할 때, 해당 스레드에 visible한 모든 non-volatile 변수들 역시 메인 메모리에 쓰여지거나 flushed 된다. 즉 volatile변수와 함께 가장 최근의 값이 RAM에 저장된다.
  • volatile 변수에 읽기 작업을 할 때, 해당 스레드에 visible한 모든 non-volatile 변수들 역시 메인 메모리에서 리프레시 된다. 즉 가장 최근의 값이 할당된다.

Activity

  1. daadaadaah commented on Feb 10, 2023

    @daadaadaah
    OwnerAuthor

    메모리 가시성 문제이란 무엇인가?

    • 가시성이란 데이터를 읽을 때 오래된 stale data가 아닌 최신 값을 읽을 수 있어야 한다는 뜻으로, 한 Thread에서 변경한 특정 메모리의 값이, 다른 Thread에서 제대로 읽어지는지에 대한 것이다.
    • 가시성 문제란, 여러 개의 스레드가 사용됨에 따라, CPU Cache Memory와 RAM의 데이터가 서로 일치하지 않아 생기는 문제를 말한다. 즉, 쓰레드가 변경한 값이 메인 메모리에 저장되지 않아서 다른 Thread에서 최신 값을 읽어오지 못해 데이터 정합성이 깨지는 문제를 말한다. 이는 싱글 스레드 환경에서는 문제가 되지 않지만, 멀티 스레드 환경에서는 문제가 된다.

    메모리 가시성은 왜 발생할까?

    • 컴파일러의 최적화 때문이다.
    • 컴파일러는 프로그램이 최대한 빠르게 실행될 수 있도록 Main Memory에서 있는 변수 값을 각각의 코어(CPU)의 레지스터와 캐쉬를 사용하도록 최적화한다.
  2. daadaadaah commented on Feb 10, 2023

    @daadaadaah
    OwnerAuthor

    synchronized와 volatitle의 차이점은 무엇인가?

    1. 동시성 문제를 해결하는 방식이 다르다.
    2. 적절한 상황이 다르다.
    • synchronized는 멀티쓰레드 환경에서 하나의 Thread가 아닌 여러 Thread가 write하는 경우, 변수 read & write의 원자성(atomic)을 보장해야하는 상황에서 사용하기 좋다.
    • volatitle은 멀티쓰레드 환경에서 하나의 Thread만 read & write하고, 나머지 Thread가 read하는 경우, 변수값을 가장 최신의 값으로 보장해야하는 상황에서 사용하기 좋다. (이 경우, synchronized를 쓰는 것은 매 작업시마다 blocking을 하기 때문에 volatile이 더 낫다.)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      0