문제의 프로그램
package javas;
import javax.swing.JOptionPane;
public class Thread1 {
public static void main(String args[]) {
Runnable r = new RunnableEX();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
}
}
class Account{
int balance = 1000;
public void withdraw(int money){
if(balance >= money){
try{ Thread.sleep(1000);}
catch (Exception e){
}
balance -= money;
}
}
}
class RunnableEX implements Runnable{
Account acc = new Account();
public void run(){
while(acc.balance>0){
int money = (int) (Math.random()*3+1)*100;
acc.withdraw(money);
System.out.println("balance : " +acc.balance);
}
}
}
balance를 서로 같이사용하기 때문에 그 부분을 동기화 시켜주지 않았기 때문이다.
해결방법
1. withdraw 메서드 부분을 synchronized 해준다.
public synchronized void withdraw(int money){
if(balance >= money){
try{ Thread.sleep(1000);}
catch (Exception e){
}
balance -= money;
}
}
2. withdraw()가 수행되는 동안 객체에 lock을 걸어준다.
public void withdraw(int money){
synchronized(this){if(balance >= money){
try{ Thread.sleep(1000);}
catch (Exception e){
}
balance -= money;
}
}
}
'JAVA > Thread' 카테고리의 다른 글
쓰레드 개념정리 (0) | 2016.12.21 |
---|---|
JAVA 데몬 스레드 소개 (0) | 2016.12.21 |
Thread wait(), notify() 소개 (0) | 2016.12.21 |
Thread 크리티컬 세션 (0) | 2016.12.21 |
java thread pool 소개 (0) | 2016.12.21 |