4-4.(2) Thread 동기화 Sync2
synchronized를 이용한 동기화 처리2
은행의 입출금을 쓰레드로 처리하는 예제
T16_SyncAccountTest
- 공통으로 사용하는 데이터 클래스 SyncAccount의 객체 sAcc 생성
- 객체 sAcc를 쓰레드 BankThread에 넘겨준다.
public class T16_SyncAccountTest {
public static void main(String[] args) {
SyncAccount sAcc = new SyncAccount();
sAcc.setBalance(10000); // 입금처리
BankThread th1 = new BankThread(sAcc);
BankThread th2 = new BankThread(sAcc);
th1.start();
th2.start();
}
}
은행의 입출금을 관리하는 클래스 정의(공유 객체)
생성자, get() set(), 일반메서드에 synchronized
class SyncAccount{
private int balance; //잔액 저장
synchronized public int getBalance() {
return balance;
}
synchronized public void setBalance(int balance) {
this.balance = balance;
}
//입금처리를 수행하는 메서드
public synchronized void deposit(int money) {
balance += money;
}
//출금 처리하는 메서드(출금 성공 : true, 출금 실패 : false반환)
//동기화 영역에서 호출하는 메서드로 동기화 처리를 해주어야 한다.
synchronized public boolean withdraw(int money) {
if(balance >= money) {// 잔액이 많을 경우
for(int i=1; i<=1000000000;i++) {}//시간 때우기용
balance -= money;
System.out.println("메서드 안에서 balance = "+getBalance());
return true;
}else {
return false;
}
}
}
은행업무를 처리하는 쓰레드
class BankThread extends Thread{
private SyncAccount sAcc;
public BankThread(SyncAccount sAcc) {
this.sAcc = sAcc;
}
@Override
public void run() {
boolean result = sAcc.withdraw(6000);//6000원 인출
System.out.println("쓰레드 안에서 result = "+result
+", balance = "+sAcc.getBalance());
}
}
synchronized 사용 안할 시
synchronized 사용 시
-
BankThread의 객체 th1, th2 생성
-
th1.start() -> BankThread 클래스 안에 run() 실행
-> run() 안에 withdraw(6000) 실행 -> SyncAccount클래스에 안에 있는 withdraw() 실행
-> setBalance(10000) -> balance 10000원이 money 6000원보다 크니까 true을 반환하고
balance가 4000원이 남는다. -
th1.start() -> BankThread 클래스 안에 run() 실행
-> run() 안에 withdraw(6000) 실행 -> SyncAccount클래스에 안에 있는 withdraw() 실행
-> balance 4000이 money 6000보다 작으니까 false를 반환하고 balance는 그대로 4000
Author And Source
이 문제에 관하여(4-4.(2) Thread 동기화 Sync2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@zhyun1220/4-42.-Thread-동기화-Sync2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)