[Java] Synchronized와 Deadlock

이지현·2023년 4월 6일
0

Java

목록 보기
26/46
post-thumbnail

✔️ Synchronized

1. Synchronized란?

  • 동기화
  • 하나의 객체에 여러 개의 객체가 동시에 접근해 처리하는 것을 막는 것
  • 공유 데이터가 사용되어 동기화가 필요한 임계영역에 동기화를 사용하여 여러 스레드가 동시에 접근하는 것을 금지함

예시)

// 메서드 앞에 synchronized 설정
synchronized void increase() {
	cnt++;
    System.out.println(cnt);
}

// 코드 블럭에 synchronized 설정
void increase() {
	synchronized(this) {
    	cnt++;
    }
    System.out.println(cnt);
}

✔️ Deadlock

1. Deadlock이란?

  • 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다리면서 무한 대기에 빠지는 상황

2. Deadlock 발생 조건

  • 상호 배제
    ◦ 한 번에 한 프로세스만 해당 자원을 사용할 수 있음
  • 점유 대기
    ◦ 자원을 최소 하나 보유하고 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 함
  • 비선점
    ◦ 이미 할당된 자원을 강제로 빼앗을 수 없음
  • 순환 대기
    ◦ 대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 함

3. Deadlock 해결 방법

(1) 데드락 예방(Prevention)

  • 자원의 상호 배제 조건 방지
    ◦ 한 번에 여러 프로세스가 공유 자원을 사용할 수 있게 함. 단, 추후 동기화 관련 문제 발생 가능성 있음
  • 점유 대기 조건 방지
    ◦ 프로세스 실행에 필요한 자원을 한 번에 요구하고 허용할 때까지 작업 보류하여 다른 자원을 점유하기 위한 대기 조건을 성립하지 않도록 함
  • 비선점 조건 방지
    ◦ 높은 우선순위의 프로세스가 해당 자원을 선점할 수 있도록 함
  • 순환 대기 조건 방지
    ◦ 자원을 순환 형태로 대기하지 않도록 일정한 한 쪽 방향으로만 자원을 요구할 수 있도록 함
    💡 데드락 예방은 시스템의 처리량이나 효율성을 떨어뜨리는 단점이 발생할 수 있음

(2) 데드락 회피(Avoidance) : 자원 할당 이후에도 시스템이 항상 Safe state에 있을 수 있도록 할당을 허용함

  • 대표적인 예 - 은행원 알고리즘(Banker's Algorithm)
    ◦ 어떤 자원의 할당을 허용하는지에 관한 여부를 결정하기 전 대기 중인 다른 프로세스들이 Safe state에 들 수 있는지 여부 검사, 즉 교착 상태 가능성 조사
    💡 Safe state : 데드락을 발생시키지 않으면서도 차례로 모두에게 할당해 줄 수 있는 안정 상태
    💡 Safe sequence : 데드락이 발생하지 않는 순서

(3) 데드락 탐지(Detection) 및 회복(Recovery)

  • 탐지 기법
    ◦ Allocation, Request, Available 등으로 시스템에 데드락이 발생했는지 여부 탐색
    ◦ 이외에도 자원 할당 그래프를 통해 탐지하는 방법이 있음
  • 회복 기법 : 순환 대기에서 벗어나 데드락으로부터 회복하기 위한 방법
    ◦ 프로세스 1개 이상 중단시키기
    ◦ 자원 선점하기

해당 내용은 다음 블로그를 참고하였습니다.

profile
2023.09 ~ 티스토리 이전 / 2024.04 ~ 깃허브 블로그 이전

0개의 댓글