달력

12

« 2024/12 »

  • 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
2011. 7. 13. 20:34

자바의 volatile 필드 JAVA이야기2011. 7. 13. 20:34

volatile  : 휘발성의

volatile필드를 읽는 것은 잠금을 획득하는 것과 같다.
 작업 메모리가 무효화되고 메모리로부터 현재 volatile 필드 값이 다시 읽혀들어온다

volatile 필드에 쓰는 것은 잠금을 푸는 것과 같아서, volatile 필드 값은 즉시 메모리에 되돌려 써진다. 

x가 volatile 일 때, x++은 다른 병행 스레드가 x를 고칠 수 있는 경우 x값이 항상 증가하지 않는다.
여기에서도 어떤 형태의 상호 배제가 여전히 필요하다.

volatile 변수가 사용되는 하나의 흔한 사용 패턴은, 여러 스레드가 그 필드를 읽지만, 오직 한 스레드만 쓰는 경우이다.

AtomicReference<T>나 AtomicInteger같은 선형화 가능한 메모리를 제공하는 클래스가 있다.
compareAndSet()과 set()메서드는 volatile 변수에 대한 쓰기처럼 동작하며,
get()메소드는 volatile 변수를 읽는 것처럼 동작한다. 

http://tomowind.egloos.com/4571673 

위 주소에 있는 글을 읽고난 후의 정리
컴퓨터구조와 연관해서 생각해보면, 각각의 cpu는 cache를 하나씩 가지고 있다. 그리고 메인 메모리는 공유한다.
다중스레드는 여러cpu에서 수행될 수 있다.

다음과 같은 예를 들어보자

int x = ??;
....
x = 20;

다중스레드에서는 여러개의 cpu에 의해 수행된다. (그러니깐 단일 스레드에 비해 속도도 빨라진다고 생각)
 cpu는 cache에 있는 데이터를 가지고 연산을 수행한다.

cpu01 의 cache :  x = 20;
cpu02 의 cache : x = ?;
cpu03 의 cache : x = ?;
cpu04 의 cache : x = ?;

cpu01에 의해 처리되는 스레드01가 x = 20;으로 바꾸었다.
이 상태에서 다른 cpu에 있는 스레드들은 20이란 값을 모른다.

여기서 volatile이란 키워드를 사용하면 스레드01은 메인메모리의 x의 변수를 20으로 바꾸고
다른 스레드들도 메인메모리의 x=20을 가져와서 모두 일관된 값을 이용할 수가 있다.

volatile은 원자적인 행동만을 보장한다. 읽기면 읽기만 보장 , 쓰기면 쓰기만 보장

내 생각임
:
Posted by НooпeУ


Code Start Code End