4-4.(3) Thread 동기화 Lock

  • Thread 동기화
    : 여러개의 Thread가 공유하여 작업 진행 ->
    : 문제가 발생할 여지가 있음 -> 임계 영역
    : 이 영역을 동기화 처리 문제발생 방지
    : 과도한 동기화는 프로그램 성능 저하 -> 필요한 영역만 선별적으로 사용

Lock을 이용한 동기화 처리

T17_LockAccountTest

1. lock 객체 생성

  • 되도록이면 private final로 만든다
    : 이유) 외부에서 접근하지 못하도록 상수로 만듦
    : ReentranLock
private final ReentranLock lock = new ReentranLock();

2. lock() -> unlock()

  • Lock 객체의 lock()메서드가 동기화 시작이고, unlock()메서드가 동기화 끝
  • lock()메서드로 동기화를 설정한 곳에서는 반드시 unlock()메서드로 해제
public void deposite(int money) {
	lock.lock(); // 동기화 시작
	balance += money; // 동기화 처리 부분
	lock.unlock(); //동기화 해제
}	

3. lock을 통해서 동기화 가능

  • lock.lock();
  • try~catch 블럭을 사용할 경우
    : unlock()메서드 호출은 finally 블럭에서 하도록 한다.
public boolean withdraw(int money) {
	lock.lock(); //lock을 통해서 동기화 가능
	boolean chk = false;
	//try~catch 블럭을 사용할 경우에는
	//unlock()메서드 호출은 finally블럭에서 하도록 한다.
	try {
		if(balance >= money) {
			for(int i=1; i <= 1000000000; i++) {} // 시간 때우기
			balance -= money;
			System.out.println("메서드 안에서 = "+ getBalance());
			chk = true;
		}
	}catch(Exception ex) {
		chk = false;
	}finally {
		lock.unlock(); //잠금해제
	}
	return chk;	
	}
}

좋은 웹페이지 즐겨찾기