doublemetal 2013. 7. 17. 01:22


class Account {

int balance = 1000;


public void withdraw(int money) {

if (balance >= money) {

try {

Thread.sleep(1000);

} catch (Exception e) {

}

balance -= money;

}

}

}


class Bank extends Thread {

static Account ac = new Account();


public Bank() {

};


public Bank(String name) {

super(name);

};


public void run() {

while (true) {

//동기화를 하면 먼저 임계구역에 접근한 스레드가 구역을 점령한다.

synchronized (ac) {

int money = (int) (Math.random() * 3 + 1) * 100;

if (ac.balance >= money) {

System.out.println(getName() + ": 원본의 balance : "

+ ac.balance);

System.out.println(getName() + ": 찾는 금액 : " + money);

ac.withdraw(money);

System.out.println(getName() + ": 수정된 balance : "

+ ac.balance);

System.out.println();

} else {

System.out.println("잔액부족");

break;

}

}

}

}

}


public class MainThread {


public static void main(String[] args) {

// TODO Auto-generated method stub

Bank b1 = new Bank("ATM");

Bank b2 = new Bank("Bank");

//동기화하기전에는 순서없이 실행이 되어서

//결과 값에 문제가 있었지만

//동기화를 하게되면 먼저 실행된 스레드가 먼저 작업을 하게 되는 대신

//올바른 결과 값을 보장 받는다.


b1.start();

b2.start();

}

}


결과 :
ATM: 원본의 balance : 1000
ATM: 찾는 금액 : 200
ATM: 수정된 balance : 800

Bank: 원본의 balance : 800
Bank: 찾는 금액 : 300
Bank: 수정된 balance : 500

ATM: 원본의 balance : 500
ATM: 찾는 금액 : 100
ATM: 수정된 balance : 400

Bank: 원본의 balance : 400
Bank: 찾는 금액 : 300
Bank: 수정된 balance : 100

잔액부족
잔액부족