와 진짜 멀티스레드 배우면서 병렬구조라는 설명 나올 때 긴장했어야 했는데..
관련 개념이 나오는구나
스레드를 상속하든, 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)를 사용해 필요한 부분만 동기화해 성능 최적화를 할 수 있다.
▷ 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;
}
}
tryLock(), lockInterruptibly() 등을 지원)
1주차, 2주차, 3주차 선택 과제를 제출 안해놨었는데, 오늘 해야할 것 같다.
아직도 %s %d %f들이 손에 익지 않는다..
큰일이다