반응형

 

 

 

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; //입금, 출금을 교대로 수행
      }
    }
 }

 


※ 동기화(同期化): 작업들 사이의 수행 시기를 맞추는 것. 사건이 동시에 일어나거나, 일정한 간격을 두고 일어나도록 시간의 간격을 조정하는 것을 이른다.

 


 

 

 

 

반응형
Posted by 공간사랑
,