http://sstory100.tistory.com/entry/JAVA-Thread-Thread의-동기화
[JAVA Thread] Thread의 동기화
※ Thread는 동시에 작업이 가능하지만 은행 인출 작업과 같이 특정 작업에 대해서는 하나의 Thread만 동작하도록 해야 한다.
Multi-Thread Program에서 하나의 Thread에 의해서만 처리할 수 있도록 하는 영역을 임계영역(critical section)이라고 한다.
JAVA Program에서는 이러한 제약을 위해 동기화 기법을 제공하며, method나 method의 body안에 synchronized를 사용한다.
- main class
class ThreadSync
{
public static void main(String[] args)
{
Bank bank = new Bank(100000); //은행에 100000원 입금
Family m1 = new Family(bank, "유재석");
Family m2 = new Family(bank, "윤종신");
Family m3 = new Family(bank, "이효리");
m1.start();
m2.start();
m3.start();
}
}
- sub class
class Bank
{
private int money;
Bank(int money)
{
this.money = money;
}
//임계영역(critical section) 내에서는 한 순간 하나의 Thread만 동작할 수 있다.
synchronized void input(int amount, String name) //은행에 돈 입금
{
money += amount;
System.out.println(name+" : 입금금액 "+amount+"원");
}
synchronized void output(int amount, String name) //은행에 돈 출금
{
if ((money - amount)>0) //출금 가능
{
money -= amount;
System.out.println(name+" : 출금금액 "+amount+"원");
}
else //출금 불가
{
System.out.println(name+" : 출금불가(잔액부족)");
}
}
public void getMoney() //잔고 조회
{
System.out.println(" 계좌 잔액: "+money+"원");
}
}
- Thread inherit class
import java.util.*;
class Family extends Thread
{
boolean flag;
Random r;
Bank kb; //은행
public Family(Bank kb, String name)
{
super(name);
this.kb = kb;
r = new Random();
}
public void run()
{
for (int i = 0;i < 5 ;i++) //입.출금 5번
{
try
{
sleep(500);
}
catch (Exception e)
{
}
if (flag) //가족 입금
{
kb.input(r.nextInt(100000), getName());
kb.getMoney();
}
else //가족 출금
{
kb.output(r.nextInt(100000), getName());
kb.getMoney();
}
flag = !flag; //입금, 출금을 교대로 수행
}
}
}
※ 동기화(同期化): 작업들 사이의 수행 시기를 맞추는 것. 사건이 동시에 일어나거나, 일정한 간격을 두고 일어나도록 시간의 간격을 조정하는 것을 이른다.