[0618] 동기화 블록

ㅇㅇㅈ·2025년 6월 18일

동기화

와 진짜 멀티스레드 배우면서 병렬구조라는 설명 나올 때 긴장했어야 했는데..
관련 개념이 나오는구나

깜자

스레드를 상속하든, Runnable을 구현하든 공유 데이터(예: static 변수, 외부 파일, DB, 싱글턴 객체 등)에 접근하면,
각 스레드는 동시에 같은 데이터를 변경/읽을 수 있다.

이때 동기화가 없으면 예상하지 못한 결과, 버그, 데이터 꼬임이 발생(ex: 은행 계좌에서 두 스레드가 동시에 출금)하게 된다.

심각한 경우 프로그램 전체가 불안정하게 되니,
멀티스레드 환경에서는 일관성과 안정성을 위해 동기화를 구현해두는 것이 좋다.

 

Java 환경에서는 synchronized 키워드로 동기화를 구현한다고 하는데,
한 번에 하나의 스레드만 특정 블록을 실행할 수 있다고 한다.


[ 메소드 / 블록 ] 동기화

1) 메소드 동기화

	private int count = 0;
    
    public synchronized void increment() {
    	count++;
    }
    
    public int getCount() {
    	return count;
    }
}

count++; 될 때 해당 메소드 전체가 잠기는 것.

 

2) 블록 동기화

	private int count = 0;
    
    public void increment() {
    	synchronized (this) {
    	count++;
        }
    }
    
    public int getCount() {
    	return count;
    }
}

synchronized(this)를 사용해 필요한 부분만 동기화해 성능 최적화를 할 수 있다.

Synchronized

  • 하나의 스레드가 종료될 때까지 다른 스레드는 무조건 대기해야한다.
  • 보다 정교한 락(lock) 제어는 불가능하다.

ReentrantLock

ReentrantLock은 보다 정교한 락 제어가 가능하다.


class LockCounter {
    private int count = 0;
    private final ReentrantLock lock = new ReentrantLock();

    public void increment() {
        lock.lock(); // 🔒 락 획득
        try {
            count++;
        } finally {
            lock.unlock(); // 🔓 락 해제 (반드시 필요)
        }
    }

    public int getCount() {
        return count;
    }
}
  • 락을 명시적으로 획득(lock)하고 해제(unlock)해야 한다
  • 더 유연한 동기화가 가능하다(tryLock(), lockInterruptibly() 등을 지원)

깜자 1주차, 2주차, 3주차 선택 과제를 제출 안해놨었는데, 오늘 해야할 것 같다.
부끄럽다

 

아직도 %s %d %f들이 손에 익지 않는다..
큰일이다

0개의 댓글