지난 시간에는 Synchronized의 정의에 대해서 알아봤습니다.
Synchronized = 동기화
스레드가 여러개 있을 때 일종의 순서 맞추는 것입니다.
다시 말해 Synchronized를 써서 영역을 만들고, 한사람만 들어올 수 있게 키워드입니다. 누군가 들어오지 못하게 문을 잠가버린다고 생각하면 이해하기 쉬울 것 같니다.
위치
1. 인스턴스 메서드
public synchronized void plus() { ... }
-> 현재 객체를 잠가버린다.
-> 옆동네는 상관 x
2. static 메서드
public static synchronized void plus() { ... }
-> 클래스 자체를 잠가버린다.
-> 객체의 개수에 상관없이 전부 기다려야
-> 전역 lock 같은 느낌
3. 블록
synchronized (lock) {
...
}
-> 괄호 안에 lock 객체를 잠가버린다.
-> lock 사용하는 애들끼리 순서 지키기
화장실을 비유로 들어보겠습니다.
1 : 우리집 화장실 한명만 (옆집 화장실은 괜찮)
2 : 아파트 전체 공동 화장실 잠금(한명씩 사용)
3 : 열쇠 있는 사람끼리 순서 있음
장단점
Synchronized는 좋은 키워드지만 남발하면 성능, 확장성에 영향이 있다.
장점
- 구현 간단
- jvm이 안전하게 획득, 해제 보장
- 작은 규모 동기화는 안정적
단점
- 경합이 심해지면 병목 현상
- 불필요한 대기
- 제어가 제한적
대체
1. ReentrantLock(조절할 때)
2. ReadWriteLock
-> 읽기는 동시 여러개 허용. 쓰기는 1개
3. StampedLock(고성능)
4. Atomic (락 없이 원자성 보장)
5. volatile (가시성만 보장)
6. Concurrent(내부적으로 동기화 설계된 자료구조)
7. 동기화 도구들 (java.util.concurrent)
->스레드 흐름 제어용
- CountDownLatch : 여러 작업 끝날 때까지 대기
- CyclicBarrier : N개 스레드가 모일 때까지 기다렸다가 동시에 출발
- Semaphore : 동시에 들어갈 수 있는 스레드 수 제한 (예: DB 커넥션 수)
- Condition : wait/notify의 상위호환 (Lock과 함께 사용)
'Java' 카테고리의 다른 글
| [Java] Stream (0) | 2026.02.03 |
|---|---|
| [Java] GC (0) | 2026.01.30 |
| [Java] Synchronized에 대해 (0) | 2026.01.23 |
| [Java] static - 2 (0) | 2026.01.18 |
| [Java] static class와 static method (0) | 2026.01.16 |