본문 바로가기

강좌/JAVA THREAD

자바 쓰레드(Thread) - Volatile 예제

요즘은 64비트 컴퓨터가 많이 보급됐지만

불과 몇년해도 32비트였다. 물론 지금도 엄청 많다.


Volatile이라는것은 변수에 동기화(?)를 거는 것이라고 한다.


자바에서 int는 32비트 연산을 수행하지만 long이나 double은 64비트 연산을 한다.

그래서 int는 원자연산이라고 한다(더이상 쪼갤수 없는..)


이와 달리 long은 아니다. 쓰레드에서 long형으로 연산을 하다 보면 값이 엉뚱하게 나올 수 있다.

아래예제가 그 예이다.


long형 두개를가지고 비교하는 것이다.

무한 반복을 해서 첫번째 long을 꺼내서 while문에서 똑같은 0번째 를 꺼내와서 비교하는것이다.

(말이 좀 이상한가 아무튼 같은 값을 비교 하는것이다.)


메인에서 쓰레드 한개를 생성해서 돌리면 오류없이 잘 돌아간다.

왜냐면 똑같은 값을 가지고 비교하니까..


하지만 쓰레드를 두개 생성해서 돌리면

오류가 난다. 왜냐면 64비트 연산중에 다른 쓰레드가 와서 그 변수를 차지해서 처리하면

엉뚱한 값이 나오는것이다.


결과 : 값이 다릅니다. a0000000c0 <--이렇게 찍힌다.


그래서 변수 longVal앞에 volatile을 주면 에러 없이 잘 찍힌다.

volatile은 동기화하는것이데 변수앞에 붙이는 키워드이다.