내가 아는 한 최종은 변수/개체를 캐시 할 수 있다는 것을 CPU에 알려주는 것입니다 (어쨌든 CPU와 CPU는 다릅니다.) x86 CPU는 실제로 코어 캐시 L1을 수행하고 있다고 생각합니다. 내 질문 다음 예에서는 myObjectFinal 개체를 final로 설정하여 CPU가 캐시 할 수있게 한 다음 내부 값을 변경합니다. myObject가 변경되는 것이 보장되지 않는다는 것을 의미합니까?최종 및 메모리 누수
final을 설정하고 CPU가 캐시를 결정하면 참조가 손상됩니까?
myObject를 변경하면 캐시 된 최종본도 변경 될 수 있습니다.
// thread 1
volatile MyObject myObject = new MyObject();
// thread 2
final MyObject myObjectFinal = myObject;
myObjectFinal.setData(1);
// thread 1
myObject.setData(2);
코드가 정확히 무슨 뜻인지 알 수 없습니다. 따라서 주요 질문은 가변적 인 객체를 최종적으로 또는 휘발성으로 만드는 것이 객체가 CPU에 의해 캐시되는 방식에 어떤 영향을 미치는지에 있습니다. 그렇다면 변경 가능한 객체에서 final 또는 volatile을 사용해야 할 때?
CPU가 변경 가능한 객체를 캐시하거나 final/volatile이 아무런 영향을 미치지 않고 코딩 일관성을 위해서만 사용됩니까?
귀하의 질문은 '최종'에 대한 것보다 '휘발성'키워드에 관한 것입니다. 당신의 (멤버) 변수가'volatile'으로 선언되면, JVM은 다른 스레드의 변경 사항이 현재 스레드에서 볼 수 있음을 확인합니다. '휘발성'키워드가 없으면'final' 키워드를 사용하지 않아도됩니다. –
** 객체 myObjectFinal이 final로 설정되어 있습니다 ** - 아니요,'Object'가'final'으로 설정되어 있지 않습니다. ** Object Reference **가'final'으로 설정되어 있습니다. 일반적으로 '휘발성'및 '최종'은 원시 유형의 가시성에 대해 의미가 있으며 다른 시나리오에서는 명시적인 '동기화'가 필요합니다. –
@Sabir 분명히 나는 객체 참조에 final을 넣고있다. 내가 객체를 복사하거나 프리미티브를 사용하면 제 질문은 의미가 없습니다. 귀하의 의견은 전혀 도움이되지 않습니다. 그리고 다시 동기화는 휘발성과 다릅니다. 이 질문은 코드의 일부를 원자 적으로하지 않는 CPU에서의 캐싱에 관한 것입니다. – chris