java의 volatile 타입은 다음과 같이 정의되어 있다.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1.4
8.3.1.4. volatile Fields
The Java programming language allows threads to access shared variables (§17.1). As a rule, to ensure that shared variables are consistently and reliably updated, a thread should ensure that it has exclusive use of such variables by obtaining a lock that, conventionally, enforces mutual exclusion for those shared variables.
The Java programming language provides a second mechanism, volatile fields, that is more convenient than locking for some purposes.
A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable (§17.4).
소스에서 자바의 volatile을 잘 만날 수 없는 요인 중에 하나는 자바 concurrent package의 클래스가 자바의 volatile을 감싸고 있기 때문이다.
예를 들어 AtomicInteger의 내부를 살펴본다. value 값에 대해서 volatile라고 선언되어 있다.
51
52 public class AtomicInteger extends Number implements java.io.Serializable {
53 private static final long serialVersionUID = 6214790243416807050L;
54
55 // setup to use Unsafe.compareAndSwapInt for updates
56 private static final Unsafe unsafe = Unsafe.getUnsafe();
57 private static final long valueOffset;
58
59 static {
60 try {
61 valueOffset = unsafe.objectFieldOffset
62 (AtomicInteger.class.getDeclaredField("value"));
63 } catch (Exception ex) { throw new Error(ex); }
64 }
65
66 private volatile int value;
72
73 public More ...AtomicInteger(int initialValue) {
74 value = initialValue;
75 }
'java core' 카테고리의 다른 글
[java8] Collectors.partitioningBy/groupingBy 간단 예제 (0) | 2017.04.24 |
---|---|
[java8] 람다 사용시 스칼라와 자바의 블럭 차이 (0) | 2017.04.21 |
하나의 인터페이스를 가진 interface에 @FunctionalInterface를 사용해 java7에서 java8 전환 (0) | 2017.04.04 |
람다를 활용한 java8의 Callable, Runnable 예제 (0) | 2017.03.27 |
java9에서 사라지는 gc (0) | 2017.03.20 |