Java
[JAVA]64비트는 왜 원자적이지 않을까? 및 연산의 원자성
Hyung1
2021. 3. 27. 03:47
728x90
반응형
volatile관련해서 책에서 32비트와 64비트에 효과적이라는 것을 보았는데,
왜 효과적이며 기존 32비트와 64비트에는 어떤 문제가 있는 것일까? 에 관한 고민을 하였다. 그리고 이에 관해 조사해 보았다.
oracle docs를 보니,
라고 써있었다. 위 글에 관한 해결 방법이 volatile이고, 아래 내용이 문제점에 관해 조사해본 내용이다.
long value = 123L;
A,B 두 쓰레드가 있을 때,
위의 value에 값이 할당될 때 완벽히 한 메모리 작업 안에서 완벽히 쓰여지지 않는다.
int value = 123;
하지만 int형이라면 완벽히 쓰여진다.
왜 그럴까?
int형 보다 더 큰 타입, long이나 객체..그리고 변수 할당 및 연산 시 일어나는 작업에서는 완벽히 원자성을 가지지 않고 여러번에 걸쳐 메모리 작업이 일어난다.
위 코드에서 long은 데이터형이 8바이트. 즉 64비트이다. 자바는 여기에 변수를 할당할 때 32비트 단위로 끊어서 할당한다. 첫 32비트를 할당하고, 그 다음 32비트를 할당한다.
첫 32비트를 할당했을때 쓰레드 A,B가 쓰기 동작을 진행할 경우 첫 32비트는 이전 값, 두 번째 32비트는 변한 값을 참조할 수도 있다.. 64비트 변수에 대한 쓰기 연산 자체가 원자성이 보장되지 않는 것이다..
자바 5이후의 volatile은 이러한 reat&write 연산에 원자성을 보장해준다.
volatile 키워드는 JVM이 두 개의 연속적인 32 비트 쓰기를 생성하지 않고 대신 하나의 64 비트 쓰기만 생성하도록 하기 때문이다.
728x90
반응형