과도 및 휘발성 수정 자란 무엇입니까?


126

누군가 Java에서 transientvolatile수정자가 무엇을 의미 하는지 설명 할 수 있습니까 ?


3
이것은 분명히 질문이 아니며 어쨌든 복제물입니다 (그래서 내가 닫기로 투표 한 이유입니다). 예를 들어 Java에 왜 일시적 변수가 있습니까? 그리고 때 정확히 자바에서 휘발성 키워드를 사용합니까? (그리고 많은 다른 사람들).
Pascal Thivent


18
이것은 완전히 유효한 질문입니다. stackoverflow.com/questions/215497/…
Barry Fruitman

답변:


156

volatiletransient개질제는 클래스 필드에 적용 할 수있는 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.417.7 입니다.


1-그러나 지역 변수 또는 매개 변수에는 해당되지 않습니다.


10

volatiletransient키워드

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


2
transient변수와 static키워드 를 함께 사용할 수없는 이유 는 정적 변수가 개별 인스턴스가 아닌 클래스에 속하기 때문입니다. 직렬화의 개념은 객체의 현재 상태와 관련이 있습니다. 클래스의 특정 인스턴스와 연관된 데이터 만 따라서 정적 멤버 필드는 직렬화시에 무시되고, 직렬화
Chaklader Asfak Arefe을

실제로 JLS는 허용 static하고 transient함께 사용할 수 있습니다. 문제는 일반적인 직렬화 메커니즘이 어쨌든 정적을 유지하지 않기 때문에 거의 의미가 없습니다.
Stephen C

7

휘발성은 다른 스레드가 해당 특정 변수를 편집 할 수 있음을 의미합니다. 따라서 컴파일러는 액세스를 허용합니다.

http://www.javamex.com/tutorials/synchronization_volatile.shtml

과도 란 객체를 직렬화 할 때 직렬화 해제시 기본값을 반환 함을 의미합니다.

http://www.geekinterview.com/question_details/2


5
"따라서 컴파일러는 액세스 할 수 있습니다." 귀하의 문장은 스레드가 기본적으로 액세스 할 수 없음을 제안합니다. 이제 링크와 내가 이해하는 다른 대답을 읽습니다. 컴파일러는 변수의 스레드 특정 중간 저장소를 수행하지 않으므로 다른 스레드가 변경 사항을 즉시 볼 수 있습니다.
헬리오스

휘발성의 C 사용과 휘발성 혼란의 java 사용을 얻었습니다. 컴파일러가 캐시 된 값 대신 필드의 actaul 값에 액세스 할 수 있음을 의미했습니다.
Raynos

그것은 그 이상을 의미합니다.
Stephen C

1

일시적 :

먼저 갭을 어떻게 연결해야하는지 알아야합니다.

1) 액세스 수정 자 과도는 가변 구성 요소에만 적용 할 수 있습니다. 메소드 또는 클래스와 함께 사용되지 않습니다.

2) 임시 키워드는 정적 키워드와 함께 사용할 수 없습니다.

3) 직렬화 란 무엇이며 어디에 사용됩니까? 직렬화는 객체의 상태를 지속시키는 프로세스입니다. 즉, 객체의 상태가 지속 (예 : 파일에 바이트 저장) 또는 전송 (예 : 네트워크를 통해 바이트 전송)에 사용되는 바이트 스트림으로 변환됩니다. 같은 방식으로 역 직렬화를 사용하여 객체의 상태를 바이트에서 다시 가져올 수 있습니다. 직렬화는 주로 네트워킹 프로그래밍에 사용되므로 Java 프로그래밍에서 중요한 개념 중 하나입니다. 네트워크를 통해 전송해야하는 객체는 바이트로 변환되어야합니다. 일시적 키워드를 이해하기 전에 직렬화 개념을 이해해야합니다. 독자가 직렬화에 대해 알고 있다면 첫 번째 단계를 건너 뛰십시오.

주 1) 과도는 주로 직렬화 프로세스에 사용됩니다. 이를 위해 클래스는 java.io.Serializable 인터페이스를 구현해야합니다. 클래스의 모든 필드는 직렬화 가능해야합니다. 필드를 직렬화 할 수없는 경우 일시적으로 표시해야합니다.

참고 2) 역 직렬화 프로세스가 수행되면 유형 제한 조건에 따라 기본값 (0, false 또는 null)으로 설정됩니다.

주 3) 일시적 키워드와 그 목적은? 임시 수정 자로 선언 된 필드는 직렬화 된 프로세스에 참여하지 않습니다. 객체가 직렬화되면 (임의의 상태로 저장 됨), 과도 필드 이외의 필드가 직렬화 프로세스에 참여하는 동안 과도 필드의 값은 직렬 표현에서 무시됩니다. 이것이 transient 키워드의 주요 목적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.