Java

[Java] Synchronized에 대해 - 2

parangofsky 2026. 1. 26. 22:19

지난 시간에는 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