티스토리 뷰


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

잔액부족
잔액부족


'java,web study > 3주차 (7월 15일 ~21일)' 카테고리의 다른 글

데몬 스레드  (0) 2013.07.17
스레드 예제 (성금 모금)  (0) 2013.07.17
JTable 02  (0) 2013.07.17
JTable  (0) 2013.07.17
Box Layout  (0) 2013.07.17
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함