누군가 Java에서 transient
및 volatile
수정자가 무엇을 의미 하는지 설명 할 수 있습니까 ?
누군가 Java에서 transient
및 volatile
수정자가 무엇을 의미 하는지 설명 할 수 있습니까 ?
답변:
volatile
및 transient
개질제는 클래스 필드에 적용 할 수있는 1 필드 유형에 관계없이. 그 외에도, 그들은 관련이 없습니다.
transient
수정은 클래스의 인스턴스를 직렬화 할 때 필드를 제외하는 자바 객체 직렬화 서브 시스템을 말한다. 그런 다음 객체를 직렬화 해제하면 필드가 기본값으로 초기화됩니다. 즉 null
, 참조 유형, 0 또는 false
기본 유형. JLS ( 8.3.1.3 참조 )는 무슨 transient
의미 인지 말하지 않지만 Java 객체 직렬화 사양을 지연시킵니다 . 다른 직렬화 메커니즘 은 필드의 transient
특성에 주의를 기울일 수 있습니다 . 아니면 무시해도됩니다.
(JLS에서는 static
필드를로 선언 할 수 있습니다 transient
.이 조합은 어쨌든 정적을 직렬화하지 않기 때문에 Java Object Serialization에는 적합하지 않습니다. 그러나 다른 상황에서는 의미가있을 수 있습니다. 완전히 금지하지 마십시오.)
volatile
수정은 필드에 쓰기는 항상 기적 메모리에 플러시되어야하고, 그 항상 메모리에서 읽어 분야의 읽고있는 JVM을 알려줍니다. 즉, 휘발성으로 표시된 필드는 기본 또는 표준 라이브러리 기반 동기화를 사용하지 않고 멀티 스레드 응용 프로그램에서 안전하게 액세스하고 업데이트 할 수 있습니다. 마찬가지로, 휘발성 필드에 대한 읽기 및 쓰기는 원자 적입니다. (이는 비 휘발성 << long
또는 double
필드 에는 적용되지 않으며 일부 JVM에서 "단어"가 발생할 수 있습니다.) JLS의 관련 부분은 8.3.1.4 , 17.4 및 17.7 입니다.
1-그러나 지역 변수 또는 매개 변수에는 해당되지 않습니다.
volatile
및 transient
키워드
1) transient
키워드는 인스턴스 변수와 함께 사용되어 직렬화 프로세스에서 제외됩니다. 필드가 transient
그 값 이면 지속되지 않습니다.
한편, volatile
키워드는 Java 변수를 "주 메모리에 저장되는"것으로 표시하는 데 사용됩니다.
volatile
변수 의 모든 읽기는 CPU 캐시가 아닌 컴퓨터의 메인 메모리에서 읽히고 변수 에 대한 모든 쓰기 volatile
는 CPU 캐시뿐만 아니라 메인 메모리에 쓰여집니다.
2) transient
키워드는 static
키워드 volatile
와 함께 사용할 수 없지만와 함께 사용할 수 있습니다 static
.
3) transient
역 직렬화 중에 변수는 기본값으로 초기화되며 값의 할당 또는 복원은 응용 프로그램 코드로 처리해야합니다.
자세한 내용은 내 블로그를 참조하십시오 :
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html
transient
변수와 static
키워드 를 함께 사용할 수없는 이유 는 정적 변수가 개별 인스턴스가 아닌 클래스에 속하기 때문입니다. 직렬화의 개념은 객체의 현재 상태와 관련이 있습니다. 클래스의 특정 인스턴스와 연관된 데이터 만 따라서 정적 멤버 필드는 직렬화시에 무시되고, 직렬화
static
하고 transient
함께 사용할 수 있습니다. 문제는 일반적인 직렬화 메커니즘이 어쨌든 정적을 유지하지 않기 때문에 거의 의미가 없습니다.
휘발성은 다른 스레드가 해당 특정 변수를 편집 할 수 있음을 의미합니다. 따라서 컴파일러는 액세스를 허용합니다.
http://www.javamex.com/tutorials/synchronization_volatile.shtml
과도 란 객체를 직렬화 할 때 직렬화 해제시 기본값을 반환 함을 의미합니다.
일시적 :
먼저 갭을 어떻게 연결해야하는지 알아야합니다.
1) 액세스 수정 자 과도는 가변 구성 요소에만 적용 할 수 있습니다. 메소드 또는 클래스와 함께 사용되지 않습니다.
2) 임시 키워드는 정적 키워드와 함께 사용할 수 없습니다.
3) 직렬화 란 무엇이며 어디에 사용됩니까? 직렬화는 객체의 상태를 지속시키는 프로세스입니다. 즉, 객체의 상태가 지속 (예 : 파일에 바이트 저장) 또는 전송 (예 : 네트워크를 통해 바이트 전송)에 사용되는 바이트 스트림으로 변환됩니다. 같은 방식으로 역 직렬화를 사용하여 객체의 상태를 바이트에서 다시 가져올 수 있습니다. 직렬화는 주로 네트워킹 프로그래밍에 사용되므로 Java 프로그래밍에서 중요한 개념 중 하나입니다. 네트워크를 통해 전송해야하는 객체는 바이트로 변환되어야합니다. 일시적 키워드를 이해하기 전에 직렬화 개념을 이해해야합니다. 독자가 직렬화에 대해 알고 있다면 첫 번째 단계를 건너 뛰십시오.
주 1) 과도는 주로 직렬화 프로세스에 사용됩니다. 이를 위해 클래스는 java.io.Serializable 인터페이스를 구현해야합니다. 클래스의 모든 필드는 직렬화 가능해야합니다. 필드를 직렬화 할 수없는 경우 일시적으로 표시해야합니다.
참고 2) 역 직렬화 프로세스가 수행되면 유형 제한 조건에 따라 기본값 (0, false 또는 null)으로 설정됩니다.
주 3) 일시적 키워드와 그 목적은? 임시 수정 자로 선언 된 필드는 직렬화 된 프로세스에 참여하지 않습니다. 객체가 직렬화되면 (임의의 상태로 저장 됨), 과도 필드 이외의 필드가 직렬화 프로세스에 참여하는 동안 과도 필드의 값은 직렬 표현에서 무시됩니다. 이것이 transient 키워드의 주요 목적입니다.