[Java] transient, volatile 키워드에 대하여

Damongsanga·2024년 3월 10일

다른 프로젝트의 소스코드를 확인하다가 익숙치 않은 자바 키워드가 있어 이에 대해 공부한 내용을 정리해보았다.

transient와 volatile에 대해 함께 알아보자!

Java transient

class Member implements Serializable {
	private transient String name;
    private String email;
    private int age;
}
// Deserialize
Member{name='null', email='example@naver.com', age='28'}
  • 객체의 필드 중 직렬화 하지 않을 필드에 사용한다.

    • 해당 필드는 직렬화되지 않는다.
    • 역직렬화 시 타입별 기본 값이 할당된다. (null, 0, …)
  • 왜 사용하는가?

    • 민감한 정보를 직렬화하지 않도록 제외할 수 있다. (패스워드, 주민등록 번호 등)
    • 필드의 값이나 객체가 계산해서 얻을 수 있는 값인 경우 사용하면 불필요한 데이터를 직렬화하지 않을 수 있다.
  • static, final과 같이 사용하는 것은 무의미하다.

    • static 필드 자체가 객체와 무관하기 때문이다.
    • 객체의 값을 바로 초기화시키기 때문이다.

Java volatile

public class SharedClass {
    public volatile int counter = 0;
}
  • Java 변수를 메인 메모리에 저장하겠다는 뜻이다.
  • 매번 변수를 read할 때 CPU 캐시가 아닌 메인 메모리에서 읽는다.
  • 변수를 write할 때 메인 메모리에 작성한다.

" 멀티 쓰레드 환경에서 Thread가 변수의 값을 읽어올 때 CPU 캐시에 저장된 값이 다르기 때문에 변수 값 불일치 문제가 발생할 수 있게 된다. "

  • Multi Thread 환경에서 하나의 Thread만 read & write하고 나머지 Thread가 read하는 상황에서 가장 최신의 값을 보장한다.

  • 여러 thread가 write 하는 상황인 경우, synchronized 를 통해 변수 read & write 의 원자성을 보장해야한다

  • 성능에 관한 고민
    메인 메모리에서 읽어오면 캐시보다 비용이 큼으로 변수 값 일치를 보장해야하는 경우에만 volatile 사용해야 한다.

참조

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

profile
향유하는 개발자

0개의 댓글