[OS] Monitor (모니터) / synchronized 이용 은행 계좌 문제

2021. 6. 13. 20:59IT

SMALL

모니터

  • 현재 동기화 문제를 해결하는 도구 중 하나
  • 모니터의 경우, 두 개의 queue가 존재하여 각각의 역할을 함
    • 배타 동기
      • 하나의 스레드만 공유 자원에 접근할 수 있게 하는 작용
      • 특정 스레드가 공유 자원을 사용하는 함수를 사용하고 있으면, 다른 쓰레드는 접근할 수 없고 대기해야 함
    • 조건 동기
      • 진입 스레드가 블록되면서 새 쓰레드가 진입 가능하게 하는 공간임
      • 새 스레드는 조건 동기로 블록된 스레드를 깨울 수 있음
        • 깨워진 스레드는 현재 스레드가 나가면 재진입할 수 있음

 

Monitor vs Semaphore

  • Semaphore 
    • 임계구역 앞에 설치되어 있는 초기값을 통해 들어갈 수 있는 한계 설정 -> S
    • 들어갈 때 acquire() / 나올 때 release 명령을 실행해 주어야 함
  • monitor
    • 함수에 synchronized 키워드를 이용해 상호배제 지켜줄 수 있음

 

Monitor in Java

이전에는 Semaphore를 이용해서 은행 계좌 예제를 풀어보았다면 monitor를 통해서도 풀어보겠습니다.

 

자바의 모든 객체는 모니터가 될 수 있습니다

 

Acc_syn.java

public class Acc_syn {
	private int balance = 0; 
    // deposit = 예금
    synchronized public void deposit(int money) {
    	System.out.println(Thread.currentThread().getName() + " : " + money + "원");
        balance += money;
        System.out.println("현재 잔액 : " + balance + "원");
	}
    synchronized public void withDraw(int money) {
    	System.out.println(Thread.currentThread().getName() + " : " + money + "원");
        balance -= money;
        System.out.println("현재 잔액 : " + balance + "원");
	}
    public void printBalance() {
		// 잔액 출력
		System.out.println("현재 잔액 : " + balance);
	}
}
    	
 

bank.java

import java.util.concurrent.Semaphore; 
public class Bank {
	static final int LOOP = 2;
	public static void main(String[] args) {
		Acc_syn a = new Acc_syn();
		a.deposit(10);
		a.withDraw(10);
		a.printBalance();
	}
}

synchronized 키워드를 이용한 은행 계좌 

LIST