2015-01-20 2 views
2

많은 프로그래밍 언어 사양은 언어의 기본 유형과 그 원자 유형에 대해 설명합니다. 일부에서는 별도로 언급하고 일부는 정의를 함께 사용합니다. 어떤 자료를 읽은 후에 나는 두 용어 사이에 차이가 있음을 깨닫게되었지만, 그것은 매우 미묘하거나 너무 애매한 것으로 보인다.기본 유형과 원자 유형의 차이점은 무엇입니까?

원자형원시 타입의 차이점은 무엇입니까? 하나는 다른 하나 안에 포함되어 있습니까?

답변

6

차이점은 기본 유형 (int 등)은 객체가 아닙니다. Java에서는 각 프리미티브 유형 (은 int 등)과 연관된 클래스가 있지만

원자 유형은 "일반"Java 객체입니다. "평범한"객체와의 차이점은 객체를 조작하는 메소드가 원자 적으로 보장되어 스레드로부터 안전하다는 것입니다. int의 경우, 이는 AtomicInteger이고, 사용자가 직접 변경할 수 있습니다 (.getAndSet() 등).

그러나 원자 작업을 지원하는 일부 클래스는 기본 유형에 연결되어 있지 않으므로 "원자 유형"과 "기본 유형"에 대해 이야기하는 것이 부분적으로 잘못되었습니다. 그러한 예가 AtomicReference이지만 AtomicIntegerArray과 그 외 몇 가지 예도 있습니다.

compare and swap 위키 백과 항목 또는 간략히 CAS를 참조하십시오.


또한 원시 형은 기본적으로 스레드로부터 안전하다고 생각하지만 이것은 사실이 아닙니다. 각 스레드는 최적화를 위해 자체 로컬 저장소 (TLS, 스레드 로컬 저장소라고도 함)를 가질 수 있으므로 원시 변수의 자체 복사본을 가질 수 있습니다. 이것이 자바에서 당신이 volatile 인 이유입니다.

0

원시 타입은 원 자성입니다. 다시 말해, 더 간단한 유형으로 구성 해제 할 수 없습니다.

+0

사실 그렇지만 64 비트 값의 읽기 및 쓰기는 원자 적입니다. –

+0

@PeterLawrey 나는 그 때 고쳐진다; 내 개인 호기심 : 언제부터? – fge

+1

@fge AFAIK 그들은 JMM을 업데이트했을 때 Java 5.0이었고 이는 이중 체크 잠금을 안전하게 만드는 것을 포함하여 수정 사항 중 하나였습니다. 64 비트 길이의 바이트 코드에서 두 개의 "슬롯"을 두 번 사용하면 참조가 64 비트 인 경우에도 하나의 슬롯 만 사용되지만 JVM이 너무 많이 실행할 때 코드를 최적화 할 때 이러한 슬롯의 의미는 대부분 역사적입니다. –

0

자바에는 기본 유형이 있고 상자 유형이 있습니다. 상자 유형은 실제 객체이며 기본 유형은 유형의 변수입니다.

예를 들어 int는 기본 유형이고 Integer는 박스형 유형입니다.

int pi; 정수 bi;

pi가 선언되어 AND로 할당되어 즉시 사용할 수 있습니다 (예 : pi = 100;

bi는 선언되었지만 다음 경우까지 할당되지 않습니다. bi = new Integer (1);

할당 전에 bi를 참조하면 java.lang.NullPointer 오류가 발생합니다.

관련 문제