작성
·
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.compareAndSwapInt
는 lock cmpxchg
와 같은 하드웨어 수준의 원자적 명령으로 매핑됩니다.)
이런 과정 덕분에 조금 더 빨리 실행이 됩니다.
쉽게 정리하면 JVM 내부에서 극한의 최적화를 해두었다고 생각하시면 됩니다.
감사합니다.