Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-19 00:03
관리 메뉴

zyint's blog

Volatile 본문

예전글들

Volatile

진트­ 2007. 7. 8. 11:15

 

volatile은 하나의 변수를 여러 쓰레드에서 사용할 때, 사용하는 키워드입니다. 

한 변수를 여러 쓰레드에서 사용하게 되며, 각 쓰레드마다 해당 변수 값을 저장하는 작업 복사본을 하나씩 가지고 있습니다... 실제 쓰레드는 주 원본에서 값을 접근하기 위해 자신의 작업 복사본에 값을 저장하고 어떠한 연산을 거친뒤에 다시 원본 값을 돌려버리는 방식을 취하죠...

이럴경우 동기화에 문제가 있습니다... 만약 화면에 변수 값을 찍는 작업을 위해 하나의 쓰레드가 자신의 작업 복사본에 값을 읽어들어왔습니다... 그리고 그 값을 찍기 이전에 다른 쓰레드가 그것을 변경했다고 한다면, 한 쪽 쓰레드는 변경되지 이전의 값이 존재하고 다른 한 쪽은 변경된 값을 가지게 됩니다... 

이것을 막기 위해 volatile을 사용하면 쓰레드가 특정 변수를 접근하려는 연산이 발생하면 무조껀 다시 주 원본의 값을 가져오게 하는 것이죠... 
/*//////////////////////////////////////////////////////////////////////////////////////*/

일반적으로 어떤 리소스가 하나 있을때 요놈이 멀티스레드가
접근한다면 안정적이지 않을수도 있다는 사실을 알고 계실것입니다.

하지만, integer형은 약간 예외가 되는 것이,
대입 연산 자체가 원자 연산이며, integer형이 뽀개질수 없다는 것이
바로 우연하게도 스레드에 대해 안정적이 되는 이유입니다.

좀 풀이해서 설명하자면, 
자바도 32 bit요, 요새 컴퓨터도 32bit입니다.
컴퓨터 한 클럭당 32bit를 이동시키는 것은
스레드가 아니라 스레드 할아버지가 와도 못 뽀갭니다.

스레드 100개가 덤벼서 integer형 변수를 조작 시켜도
이 값이 불안정해지는(머 달리 표현할 말이 없으니) 그런일은 생기지
않습니다.

하지만 이것은 대입 연산 자체가 원자연산이라서 그런것이라기보다
integer형이 32bit이고 컴퓨터가 32bit라서 그렇습니다.

만일 컴퓨터가 8bit라면(이렇다면 자바가 설치도 안되겠지만)
이 32bit짜리 정수형 연산도 값이 불안정해질 우려가 있습니다.

역으로 생각해보면 자바에서 double형과 float형도 뽀개질 우려가
있다는 것이지요? (double형이 64bit던가요? 머 글타고 치고)
double형이 64bit라면 이것이 CPU로 두번씩 나누어 전송되어야
하는데 이것이 문제가 될 소지가 있다 이거져.

따라서 이것을 막기 위해서 double형이나 float형 변수에
volatile을 붙입니다.

synchronized는 변수 앞에 못 붙입니다.

/*transient는 객체 직렬화시에 멤버 변수의 전송을
막기 위한 것입니다. volatile하고는 개념 자체가 아무런 상관이
없습니다. */

http://blog.naver.com/amebas?Redirect=Log&logNo=120022290373

이 글은 스프링노트에서 작성되었습니다.

Comments