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

Damongsanga·2024년 3월 10일
0

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

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개의 댓글