인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

사차님의 프로필 이미지
사차

작성한 질문수

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

정리

안녕하세요 cas 질문이 있습니다.

작성

·

89

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

 

안녕하세요 강의 잘 듣고 있습니다.

cas 강의에서

volatile int와 atomicInteger의 performance 차이를 보니까 atomicInteger가 더 빠른 것을 알 수 있었습니다.

 

그런데 이건 조금 이해가 잘 안되는게,

atomicInteger 자체가 volatile을 내장하고 있는 거라 생각했는데 왜 volatile보다 속도가 빠른 지 이해가 잘 가지 않습니다.

volatile은 어떤 락도 안 걸고(그래서 결과가 다르게 나오지만) 가시성만 고려하기 때문에 atomicInteger보다 결과가 좋아야 할 것 같은데 반대의 결과가 나와서 궁금해서 질문드립니다.

답변 1

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 사차님

JVM은 자바 표준 라이브러리 중 빈번히 사용되고 성능에 매우 중요한 메서드들에 대해서 최적화를 진행해둡니다.

AtomicInteger의 incrementAndGet() 메서드도 내부에서는 최적화를 진행해두었습니다.

그래서 즉시 CPU의 특정 기계어 명령어를 사용하도록 변환됩니다.

(예를 들어, x86 아키텍처의 경우 Unsafe.compareAndSwapIntlock cmpxchg와 같은 하드웨어 수준의 원자적 명령으로 매핑됩니다.)

이런 과정 덕분에 조금 더 빨리 실행이 됩니다.

쉽게 정리하면 JVM 내부에서 극한의 최적화를 해두었다고 생각하시면 됩니다.

감사합니다.

사차님의 프로필 이미지
사차

작성한 질문수

질문하기