Java 메모리 모델에서는 int
을 쓰는 것이 필수적이라고 규정합니다. 즉, 한 스레드에서 값을 쓰고 다른 스레드에서 값을 읽으면 모든 바이트 또는 하나도 가져 오지는 않지만 결코 새로운 바이트 2 개와 오래된 바이트 2 개를 얻지는 않습니다.64 비트 VM에서 참조 원자를 쓰는 중입니다
long
에 대한 보장이 없습니다. 여기서 을 변수 0
에 저장하기 전에 쓰면 다른 스레드가 0x112233440000000
또는 0x0000000055667788
이 될 수 있습니다.
이제 사양에서는 개체 참조를 int 또는 long으로 지정하지 않습니다. 타입 안전성을 위해, 나는 그들이 원자 적으로 쓰여질 수 있다고 확신하지만, 64 비트 VM에서 이러한 참조는 64 비트 값 (단순히 메모리 주소) 일 수있다.
지금 여기 내 질문은 :
- 이가 (내가 발견하지 않았 음) 포함하는 모든 메모리 모델 사양이 있습니까?
- 64 비트 VM에서 장기간 쓰기가 의심 스럽습니까?
- VM이 32 비트 참조를 매핑해야합니까?
감사합니다, 스테 펜
@Steffen 하일 : 하찮은 일에 속 태우고가 아닌 모든 참조 (의한 64 비트 참조 발생되는 폐기물의 굉장한 양)에도 64 비트 VM에 내부적으로 64 비트 참고.현대의 VM은 * "CompressedOops"*라고하는 포인터 압축/참조 압축을 사용하고 있습니다. : http://wikis.sun.com/display/HotSpotInternals/CompressedOops 그래서 64 비트 값이 될 수는 있지만 그럴 수는 없습니다. 더크가 게시 한 답변에 많은 변화가있는 것은 아닙니다. – SyntaxT3rr0r