728x90
반응형
Java에서 synchronized는 멀티스레드 환경에서 공유 자원을 안전하게 다루기 위해 사용하는 키워드예요.
1️⃣ 기본 개념
- 멀티스레드 문제: 여러 스레드가 동시에 같은 자원(변수, 객체 등)에 접근하면 데이터가 꼬이거나 예상치 못한 결과가 발생할 수 있어요.
- 해결책: synchronized를 사용해서 한 번에 하나의 스레드만 접근하도록 제한.
- 락(Lock): synchronized는 내부적으로 **객체의 모니터(lock)**를 사용해 스레드 접근을 제어합니다.
2️⃣ synchronized 사용 방법
2-1. 메서드에 적용
public synchronized void increment() {
count++; // 한 스레드만 접근 가능
}
- 이렇게 하면 increment() 메서드 전체가 동기화됩니다.
- 장점: 간단하게 메서드 전체를 보호 가능
- 단점: 메서드 전체가 잠기므로 성능 저하 가능
2-2. 블록에 적용
public void increment() {
synchronized(this) {
count++; // 한 스레드만 접근 가능
}
}
- synchronized(this) → 현재 객체의 모니터(lock)를 사용
- 장점: 필요한 부분만 동기화 가능 → 성능 향상
- 다른 객체를 lock으로 사용할 수도 있음:
synchronized(someObject) { // someObject에 대해 lock 획득 }
3️⃣ 동작 원리
- 스레드가 synchronized 블록에 들어가려고 하면 락을 먼저 획득해야 함.
- 락을 얻으면 블록 안 코드를 실행.
- 블록 종료 시 자동으로 락 해제.
- 다른 스레드는 락이 해제될 때까지 기다림.
4️⃣ 예제
class Counter {
private int count = 0;
public void increment() {
synchronized(this) { // 현재 객체에 대한 락 획득
count++;
System.out.println(Thread.currentThread().getName() + ": " + count);
}
}
}
public class SyncExample {
public static void main(String[] args) {
Counter counter = new Counter();
Runnable task = () -> {
for (int i = 0; i < 5; i++) {
counter.increment();
}
};
Thread t1 = new Thread(task, "Thread-1");
Thread t2 = new Thread(task, "Thread-2");
t1.start();
t2.start();
}
}
✅ 출력 예시:
Thread-1: 1
Thread-1: 2
Thread-1: 3
Thread-2: 4
Thread-2: 5
💡 정리:
- synchronized = 스레드 안전하게 공유 자원 보호
- 메서드 전체 또는 블록 단위로 사용 가능
- 내부적으로 **모니터(락)**를 사용
- wait()와 notify()는 반드시 synchronized 블록 안에서만 사용 가능
728x90
반응형
'JAVA' 카테고리의 다른 글
[JAVA] 스레드와 wait()와 notify() 상호작용 (0) | 2025.10.02 |
---|---|
[JAVA] 모니터(Monitor) (0) | 2025.10.01 |
[JAVA] Object.wait() (0) | 2025.09.25 |
[JAVA] Thread.sleep() (0) | 2025.09.24 |
[JAVA] String 배열 초기화 (0) | 2025.07.21 |