[JAVA] 자바 synchronized 를 바이트코드로 까보며 이해하기
·
Language/Java
자바에서 synchronized는 모니터 락을 잡는다 정도로 보통 설명하지만, 실제로 JVM 바이트코드 레벨에서는 어떻게 구현되는지 궁금해졌다. 간단한 Account 예제를 작성해서 javap -c -v로 디스어셈블하고, synchronized 블록과 메서드가 어떤 바이트코드로 바뀌는지 직접 확인해 보았다.1. 예제 코드와 디스어셈블 결과이번에 사용한 예제 바이트코드는 대략 다음과 같다.public class Account minor version: 0 major version: 65 flags: (0x0021) ACC_PUBLIC, ACC_SUPER this_class: #8 // Account super_class: #2 ..
[JAVA] 자바 동시성 프로그래밍: 기초부터 메모리 모델, 설계 전략까지 한 번에 정리하기
·
Language/Java
1. 왜 이 글을 쓰는가?단일 스레드 환경에서는 코드가 위에서 아래로 순차적으로 실행되기 때문에 상태 변화를 추적하기 쉽다. 하지만 멀티코어 환경에서 여러 스레드가 동시에 실행되면, CPU 캐시와 메인 메모리 사이의 데이터 불일치로 인해 예상치 못한 버그가 발생한다. 단순히 synchronized 를 쓰면 안전하다고 외우기보다, 자바 메모리 모델(JMM)이 어떻게 작동하고 JVM 내부에서 스레드와 모니터 락이 어떤 구조로 관리되는지를 정리하는 것이 목적이다. 이 글은 다음 질문들에 답하는 것을 목표로 한다.왜 스레드를 늘린다고 무조건 성능이 좋아지지 않는가? (암달의 법칙)자바 스레드의 실제 상태는 어떻게 변하며 인터럽트는 왜 중요한가?JMM의 Happens-Before 관계란 무엇인가?synchroni..