일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- jvm
- 자바
- 자바 ORM 표준 JPA 프로그래밍
- JPA
- 보조스트림
- 이스티오
- Kotlin
- list
- MSA
- K8s
- 스프링
- gradle
- redis
- Stack
- GC
- thread
- 토비의 스프링 정리
- spring
- OS
- Java
- Real MySQL
- 쿠버네티스
- IntellJ
- 토비의 스프링
- mysql
- 백준
- 스트림
- Collection
- Stream
- SpringBoot
Archives
- Today
- Total
인생을 코딩하다.
[JAVA]64비트는 왜 원자적이지 않을까? 및 연산의 원자성 본문
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
반응형
'Java' 카테고리의 다른 글
[JAVA] Blocking I/O, Non-Blocking I/O(NIO)와 대용량 트레픽 (0) | 2021.04.07 |
---|---|
[Java]블로킹 큐(Blocking Queues) (0) | 2021.03.28 |
[Java][Spring] Filter와 Interceptor (0) | 2021.02.27 |
[Java]마커 인터페이스와 Serializable 동작 방식 (0) | 2021.02.18 |
[Java]ArrayDeque (0) | 2021.02.15 |
Comments