transient와 volatile은
- 발음기호도 어렵고
- access modifier 이면서도 사용한 적도 없고
- 기능도 이해를 못하고 있었다.
transient와 volatile은 모두 jvm 메모리와 관련된 키워드이며 각각 serialized와 jvm, thread, synchronized 에 대한 선지식이 있어야 이해가능한 내용이다.
transient는 field가 serialized 대상 제외 되기 위한 키워드이며 serialized 에 대해 알아볼 때 이미 숙지한 내용인데
오늘 다시 검색해보니 생각의 전환을 하는 글을 봤다.
"this field is for in-memory use only. don't persist or move it outside of this particular VM in any way. Its non-portable". i.e. you can't rely on its value in another VM memory space. Much like volatile means you can't rely on certain memory and thread semantics. 출처
공부를 시작 전에 하기 싫어서 뜸을 들이게 되지만 막상 하게 되면 이렇게 생각이 전환이 되거나 지식이 확장될 때만 느낄 수 있는 즐거움이 있다.
volatile의 경우 의미는 휘발성이다. (구글 번역)
구글링을 통해 습득하고 있었는데 설명에
"volatile 변수를 읽어 들일 때 CPU 캐시가 아니라 컴퓨터의 메인 메모리로 부터 읽어들입니다"
라는 내용을 보고 의아했다.
왜냐면 field 혹은 instance 는 jvm위 stack, heap에서 이미 관리되는데 중첩된 기능이지 싶었으나
cpu cache 에 대한 존재가 나오면서 생각의 확장되는 느낌이 들었다. jvm 외의 영역에서 데이터를 관리할 것이란 생각을 전혀 하지 못했었다.
volatile 키워드는 데이터가 cpu cache에 등록되지 않고 jvm위에서만 crud 가 가능하도록 한다.
cpu cache에 대한 궁금한 내용이 생겼으나 아직 해소된 상태는 아니다.
- cpu cache로 이주 되는 데이터 선정 기준
- 다시 jvm 메모리로 반환 되는 기준
- 상주 제한 (시간, 데이터 타입 등등)
- muti-thread 환경에서 synchrnoized 역할을 완벽하게 하는가
volatile과 transient를 알아보며
나는 두 키워드가 지금까지 access modifier라는 착각을 하고 있었다. final이나 static 처럼 메모리에 관련된 키워드 였다.
물론 access modifier(private, default, protected, public)도 키워드 이다.
java keyword list
https://www.w3schools.com/java/java_ref_keywords.asp
'java' 카테고리의 다른 글
XML vs JSON vs YAML (0) | 2019.10.02 |
---|---|
Springframework 단상 (0) | 2019.09.30 |
shallow & deep copy (0) | 2019.08.23 |
Serializable (0) | 2019.08.02 |
Java 실행 구조 (0) | 2019.07.25 |