많은 프로그래밍 언어 사양은 언어의 기본 유형과 그 원자 유형에 대해 설명합니다. 일부에서는 별도로 언급하고 일부는 정의를 함께 사용합니다. 어떤 자료를 읽은 후에 나는 두 용어 사이에 차이가 있음을 깨닫게되었지만, 그것은 매우 미묘하거나 너무 애매한 것으로 보인다.기본 유형과 원자 유형의 차이점은 무엇입니까?
원자형과 원시 타입의 차이점은 무엇입니까? 하나는 다른 하나 안에 포함되어 있습니까?
많은 프로그래밍 언어 사양은 언어의 기본 유형과 그 원자 유형에 대해 설명합니다. 일부에서는 별도로 언급하고 일부는 정의를 함께 사용합니다. 어떤 자료를 읽은 후에 나는 두 용어 사이에 차이가 있음을 깨닫게되었지만, 그것은 매우 미묘하거나 너무 애매한 것으로 보인다.기본 유형과 원자 유형의 차이점은 무엇입니까?
원자형과 원시 타입의 차이점은 무엇입니까? 하나는 다른 하나 안에 포함되어 있습니까?
차이점은 기본 유형 (int
등)은 객체가 아닙니다. Java에서는 각 프리미티브 유형 (은 int
등)과 연관된 클래스가 있지만
원자 유형은 "일반"Java 객체입니다. "평범한"객체와의 차이점은 객체를 조작하는 메소드가 원자 적으로 보장되어 스레드로부터 안전하다는 것입니다. int
의 경우, 이는 AtomicInteger
이고, 사용자가 직접 변경할 수 있습니다 (.getAndSet()
등).
그러나 원자 작업을 지원하는 일부 클래스는 기본 유형에 연결되어 있지 않으므로 "원자 유형"과 "기본 유형"에 대해 이야기하는 것이 부분적으로 잘못되었습니다. 그러한 예가 AtomicReference
이지만 AtomicIntegerArray
과 그 외 몇 가지 예도 있습니다.
compare and swap 위키 백과 항목 또는 간략히 CAS를 참조하십시오.
또한 원시 형은 기본적으로 스레드로부터 안전하다고 생각하지만 이것은 사실이 아닙니다. 각 스레드는 최적화를 위해 자체 로컬 저장소 (TLS, 스레드 로컬 저장소라고도 함)를 가질 수 있으므로 원시 변수의 자체 복사본을 가질 수 있습니다. 이것이 자바에서 당신이 volatile
인 이유입니다.
원시 타입은 원 자성입니다. 다시 말해, 더 간단한 유형으로 구성 해제 할 수 없습니다.
자바에는 기본 유형이 있고 상자 유형이 있습니다. 상자 유형은 실제 객체이며 기본 유형은 유형의 변수입니다.
예를 들어 int는 기본 유형이고 Integer는 박스형 유형입니다.
int pi; 정수 bi;
pi가 선언되어 AND로 할당되어 즉시 사용할 수 있습니다 (예 : pi = 100;
bi는 선언되었지만 다음 경우까지 할당되지 않습니다. bi = new Integer (1);
할당 전에 bi를 참조하면 java.lang.NullPointer 오류가 발생합니다.
사실 그렇지만 64 비트 값의 읽기 및 쓰기는 원자 적입니다. –
@PeterLawrey 나는 그 때 고쳐진다; 내 개인 호기심 : 언제부터? – fge
@fge AFAIK 그들은 JMM을 업데이트했을 때 Java 5.0이었고 이는 이중 체크 잠금을 안전하게 만드는 것을 포함하여 수정 사항 중 하나였습니다. 64 비트 길이의 바이트 코드에서 두 개의 "슬롯"을 두 번 사용하면 참조가 64 비트 인 경우에도 하나의 슬롯 만 사용되지만 JVM이 너무 많이 실행할 때 코드를 최적화 할 때 이러한 슬롯의 의미는 대부분 역사적입니다. –