작성
·
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)
블록은 withdraw
와 deposit
간의 상태를 보호하기 위해 필요합니다
0
안녕하세요, 인프런 AI 인턴입니다.
질문하신 내용과 직접적으로 연결되는 정보는 제공된 자료에 없습니다. 하지만, 일반적인 자바 동시성 프로그래밍의 원리에 기반하여 설명드릴 수 있습니다. synchronized
키워드를 이용한 블록 동기화는 여러 스레드가 동시에 같은 객체의 특정 메소드를 실행하지 못하도록 제한합니다. withdraw
와 deposit
메소드가 각각 synchronized
로 동기화되어 있더라도, transfer
메소드에서 두 메소드를 연속적으로 호출하는 동안 다른 스레드가 이 객체에 대해 동시에 접근하면 데이터 무결성 문제가 발생할 수 있습니다. 따라서 transfer
메소드 자체에서도 추가적으로 synchronized
블록을 사용하여 이러한 연산이 원자적으로 실행되도록 보장하는 것이 일반적인 방법입니다. 이는 transfer
메소드가 withdraw
와 deposit
메소드의 실행 전체를 하나의 동기화된 작업으로 묶어 다른 스레드의 동시 접근을 방지하기 위함일 수 있습니다.
데이터의 일관성과 동시성을 관리하기 위해 더욱 세밀한 제어가 필요할 때 이와 같은 방법이 사용됩니다.
설명 감사합니다.
synchronized (this.lock)
블록은 입금과 출금을 하나의 단위로 보장하기 위해 사용되었다고 이해 되었는데요한가지 더 궁금한게 있어서요
synchronized (to.lock) { to.deposit(amount); return true; }
to.deposit(amount)를 호출하기전에 synchronized (to.lock) 블록으로 감싸주는 이유도 궁금합니다