Volatile 이란? Synchronized 와 다른점은?

Jinhan Choi
2 min readJun 8, 2020

--

쓰게되면? : 해당 변수를 Main memory에 저장하겠다.

일반적인 변수의 read write 를 생각해보자.
컴퓨터의 cpu는 cpu cache를 갖고있고, main memory 에서 읽어서 사용하는 변수들을 caching 해둔다. ( 성능적인 이점을 위해 )

그렇다면 multi thread를 사용하는 상황에선?

read를 생각해보자.

cpu1에서 동작하는 thread가 변수 counter를 main memory에서 읽어온다. (초기값 0)

이후 +1을 해준다. 그리고 cpu cache에 값을 갖고있다.

cpu2의 thread도 비슷한 시점에 main memory에서 counter를 읽어온다. 이때도 0의 값을 갖고왔다. 하지만 이미 cpu1에서 +1을 해주었으나. 반영되지 않은 것으로 보인다.

data의 정합성이 깨졌다.

그래서 주로 우리는 synchronized 를 사용해서 모니터를 얻고 데이터의 정합성을 맞춘다. 하지만 synchronized는 multi thread 가 read, write를 모두 할 때 적합하다.

volatile은 하나의 thread만 write하고 multi thread에서 read할 때 사용한다.

즉 cpu cache에 값을 저장하지 않고, main memory에 바로 저장하는 방식으로 데이터의 정합성을 맞출수 있다.

write는 한 thread만 하기 때문에 main memory에 모니터를 얻지 않고 단순히 write를 하고, 나머지는 다이렉트로 main memory에서 값을 읽기 때문에 최신 값을 바로 읽는다.

하지만 cpu cache 를 쓰지 않기 때문에 생기는 성능적 손해는 분명히 존재한다.

하나의 thread만 write, multi thread에서 read 할 경우 사용하라.

--

--

No responses yet