인프런 커뮤니티 질문&답변

김관욱님의 프로필 이미지
김관욱

작성한 질문수

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

synchronized 블록 동기화

예제 transfer 메서드

작성

·

163

0

안녕하세요, 강사님.

 

강의 40분에 나오는 예제의 transfer메서드에서 호출하는 withdraw, deposit 메소드는 이미 synchronized 블록 동기화가 되어있는데 왜 또 호출전에 synchronized 블록 동기화 구문을 작성하는지 궁금합니다.

 

감사합니다.

답변 2

1

정수원님의 프로필 이미지
정수원
지식공유자

네 코드를 보시면

public boolean transfer(BankAccount to, double amount) {
    synchronized (this.lock) {
        if (this.withdraw(amount)) {
            synchronized (to.lock) {
                to.deposit(amount);
                return true;
            }
        }
        return false;
    }
}

위에서 this.withdraw(amount) 과 to.deposit(amount) 은 서로 다른 모니터 객체입니다.

즉 this 와 to 는 서로 다릅니다

이렇게 모니터가 다른 객체를 여러 스레드가 동시에 접근하게 되면 this.withdraw(amount) 를 실행하는 동안 다른 스레드가 to.deposit(amount) 를 실행할 수 있습니다.

그렇기 때문에 전체 코드를 동기화해주어야 오직 하나의 스레드만 접근해서 코드실행을 완료할 수 있습니다.

만약 this.withdraw(amount) 가 실행이 완료되면 즉시 모니터를 반환하게 되고 이 때 다른 스레드가 to.deposit(amount) 에 접근하게 되면 balance 의 공유 값이 변경이 되어 버립니다.

결론적으로 synchronized (this.lock) 블록은 withdrawdeposit 간의 상태를 보호하기 위해 필요합니다

김관욱님의 프로필 이미지
김관욱
질문자

설명 감사합니다.

synchronized (this.lock) 블록은 입금과 출금을 하나의 단위로 보장하기 위해 사용되었다고 이해 되었는데요

한가지 더 궁금한게 있어서요
synchronized (to.lock) { to.deposit(amount); return true; }

to.deposit(amount)를 호출하기전에 synchronized (to.lock) 블록으로 감싸주는 이유도 궁금합니다

0

안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용과 직접적으로 연결되는 정보는 제공된 자료에 없습니다. 하지만, 일반적인 자바 동시성 프로그래밍의 원리에 기반하여 설명드릴 수 있습니다. synchronized 키워드를 이용한 블록 동기화는 여러 스레드가 동시에 같은 객체의 특정 메소드를 실행하지 못하도록 제한합니다. withdrawdeposit 메소드가 각각 synchronized로 동기화되어 있더라도, transfer 메소드에서 두 메소드를 연속적으로 호출하는 동안 다른 스레드가 이 객체에 대해 동시에 접근하면 데이터 무결성 문제가 발생할 수 있습니다. 따라서 transfer 메소드 자체에서도 추가적으로 synchronized 블록을 사용하여 이러한 연산이 원자적으로 실행되도록 보장하는 것이 일반적인 방법입니다. 이는 transfer 메소드가 withdrawdeposit 메소드의 실행 전체를 하나의 동기화된 작업으로 묶어 다른 스레드의 동시 접근을 방지하기 위함일 수 있습니다.

데이터의 일관성과 동시성을 관리하기 위해 더욱 세밀한 제어가 필요할 때 이와 같은 방법이 사용됩니다.

김관욱님의 프로필 이미지
김관욱

작성한 질문수

질문하기