synchronized는 자바에서 가장 기본적인 동기화 키워드로, 한 번에 하나의 스레드만 특정 블록에 접근하도록 락을 걸어주는 기능이다.
synchronized는 JVM 수준에서 락을 관리하는 동기화 메커니즘JVM에서 여러 스레드는 공유 자원을 Heap 영역에 저장해 함께 접근한다. 하지만 각 스레드는 독립적인 Thread Stack과 CPU 레벨의 캐시 메모리를 사용한다. 즉, 한 스레드가 Heap에 있는 값을 수정해도 다른 스레드의 CPU 캐시에 이전 값이 남아있을 수 있다. 이것이 바로 가시성(visibility) 문제가 된다.
| synchronized의 핵심 역할 | 설명 |
|---|---|
| Mutual Exclusion (상호 배제) | 한 시점에 오직 하나의 스레드만 특정 블록/메서드에 접근 가능 |
| Visibility (가시성 보장) | 스레드가 락(lock)을 획득하거나 해제할 때, CPU 캐시 ↔ 메인 메모리(RAM) 동기화 발생 |

스레드가 synchronized 블록에 들어갈 때
flush해서 최신 상태로 만듦실행 중에는
블록이 끝날 때
synchronized 키워드를 만나면 JVM이 객체의 모니터를 활용해 락을 관리한다.
락 획득 (monitorenter)
임계 구역 실행
락 해제 (monitorexit)
synchronized 블록이 끝나면 JVM이 락 해제flush 되어 다른 스레드가 최신 데이터를 볼 수 있게 됨멀티스레드 환경에서 공유 자원에 대한 접근을 제어하는 대표적인 두 가지 기법이다.
뮤텍스는 한 번에 오직 하나의 스레드만 공유 자원에 접근할 수 있도록 제한하는 락이다. 한 스레드가 락을 획득하면 다음 스레드는 무조건 대기해야 한다.
세마포어는 허용 가능한 스레드 개수를 지정할 수 있는 락이다. 운영체제와 Java Semaphore에서 많이 사용된다.
n이라면 동시에 최대 n개의 스레드 접근 가능