JAVA/Thread

synchronized 쓰레드 예제 프로그래밍

위들 wedul 2016. 12. 21. 22:59
반응형

문제의 프로그램

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;

}

}

}


728x90
반응형

'JAVA > Thread' 카테고리의 다른 글

쓰레드 개념정리  (0) 2016.12.21
JAVA 데몬 스레드 소개  (0) 2016.12.21
synchronized 쓰레드 예제 프로그래밍  (0) 2016.12.21
Thread wait(), notify() 소개  (0) 2016.12.21
Thread 크리티컬 세션  (0) 2016.12.21
java thread pool 소개  (0) 2016.12.21
1 2 3 4 5 6 7 8 9 10 ··· 13