의문점 공부하기/🧾공부하며

🧾 여러 스레드가 공유된 메모리에 접근하여 값을 변경하면????

아리빠 2023. 7. 14. 11:10

여러 스레드가 같은 메모리에 접근하여 값을 변경할 때  문제가 발생 →의도된 대로 동작하지 않음

 

여러 스레드가 동시에 실행할 때 문제가 발생할 수 있는 코드 블럭을 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)