volatile, transient 키워드의 의미

devdo·2022년 1월 14일
0

Java

목록 보기
12/59

둘다 변수에만 걸 수 있는 키워드들이다.

volatile

volatile keyword는 변수를 Main Memory에 저장하고 읽어오라는 것이다. 멀티스레드로 접근하고 있음을 알려주는 것인데 읽기,쓰기에 대해서 동기화를 보장해준다.

즉, 매번 변수의 값을 Read할 때마다 CPU cache에 저장된 값이 아닌 Main Memory에서 읽는 것이며,
그다음 변수의 값을 Write할 때마다 Main Memory에까지 작성하라는 것이다.


왜 필요해?

  • volatile 변수를 사용하고 있지 않는 MultiThread 어플리케이션에서는 Task를 수행하는 동안 성능 향상을 위해 Main Memory에서 읽은 변수 값을 CPU Cache에 저장하게 된다.

  • 만약에 Multi Thread환경에서 Thread가 변수 값을 읽어올 때 각각의 CPU Cache에 저장된 값이 다르기 때문에 변수 값 불일치 문제가 발생하게 된다.


그럼 synchronized하고는 무슨 차이?

synchronized행위(메서드)에 대한 동기화이며 volatile행위의 타겟(변수)에 대한 동기화 이다.

  • volatile는
    하나의 Thread가 write하고, 다른 여러 개의 Thread가 read하는 상황에 적합하고,

  • synchronized는
    여러 Thread가 read/write하는 상황에 적합하다.
    synchronized는 read & write의 원자성(atomic)을 보장하기 때문이다. 그외에도 Atomic.*클래스를 써야 한다.


transient

transient는 객체 객체직렬화(Serializable)시에 멤버 변수의 전송을 막기 위한 것이다.

즉,
IO에서 어떤 객체를 객체직렬화(Serializable)하여 처리할시 모든 인스턴스 변수는 기본적으로 Serializable 상태이다.

만약 인스턴스변수중 직렬화를 원하지 않는 변수가 있다라고 가정할때 해당 변수를 transient로 선언해 주면 되는 것이다.


참고

https://nesoy.github.io/articles/2018-06/Java-volatile

profile
배운 것을 기록합니다.

0개의 댓글