여러 스레드가 같은 메모리에 접근하여 값을 변경할 때 문제가 발생 →의도된 대로 동작하지 않음
여러 스레드가 동시에 실행할 때 문제가 발생할 수 있는 코드 블럭을 Critical Section 또는 Critical Region이라 칭함
여러 스레드가 같은 메모리를 동시에 접근해도, 메모리 조회만 하면 문제 없는데 이를 스레드 안전이라 부른다
해결책은?
=> synchronized 키워드를 사용, 한 번에 한 스레드만 해당 메서드 또는 블록에 진입할 수 있다
다른 스레드는 진입한 스레드가 해당 메서드나 블록의 실행을 마칠 때까지 기다려야 한다
public synchronized void criticalMethod() {
// Critical Section
// 동기화가 필요한 작업 수행
}
=>코드 블록에 동시에 진입할 수 있는 스레드의 개수를 제어 : semaphore(n)
Semaphore semaphore = new Semaphore(1); // 세마포어 생성, 한 번에 한 스레드만 진입 가능
try {
semaphore.acquire(); // 세마포어 진입 시도, 다른 스레드가 이미 진입한 경우 대기
// Critical Section
// 동기화가 필요한 작업 수행
} catch (InterruptedException e) {
// 예외 처리
} finally {
semaphore.release(); // 세마포어 해제, 다른 스레드가 진입할 수 있도록 함
}
=> 상호 배제는 여러 스레드가 동시에 공유된 자원에 접근하는 것을 제한하여 데이터의 일관성을 유지하기 위한 개념 mutex는 이를 구현하기 위한 동기화 기법 중 하나 :mutex(mutual exclusion)
'의문점 공부하기 > 🧾공부하며' 카테고리의 다른 글
🧾 Auto commit을 false로 설정해야 하는 이유는???? (0) | 2023.07.26 |
---|---|
🧾 스레드를 재사용해야 하는 이유 (0) | 2023.07.14 |
🧾 디버깅과 컴파일의 차이와 로깅이란? (0) | 2023.07.07 |
🧾GOF 패턴이란? (0) | 2023.07.07 |
🧾intelliJ 에서 모듈과 패키지는 무슨 차이인가..? (1) | 2023.07.06 |