스레드 동기화

CHM·2022년 4월 21일

Java 활용

목록 보기
12/15

스레드 동기화

  • 하나의 스레드로 동작하는 프로그램은 각각의 객체를 생성해서 사용하게 되므로 문제가 없었다.
  • 멀티스레드 환경에서는 여러 스레드가 하나의 객체를 사용하는 경우가 생김!
    => 각 스레드에서 해당 객체의 필드 값을 변경하게 되면 의도대로 프로그램이 실행되지 않는다.
  • 스레드 동기화(Synchronized)
    : 하나의 스레드가 모든 작업이 끝날 때까지 다른 스레드가 해당 객체의 값을 변경하지 못하도록 하는 것.

동기화 지정 방법

  • 동기화 메서드
synchronized 메서드명() {
   ...
}
  • 동기화 블록
synchronized (thi s) {
   ...
}

동기화 예제

  • 계산하는 클래스
public class Calc {
   int total = 0;
   
   // 동기화 메서드
   /*
   syschronized public void sum() {     // 메서드 앞에 synchronized 삽입
      for(int i = 0; i <= 100; i++) {
         total += i;
         System.out.println(Thread.currentThread().getName() + " : " + total);
      }
   }
   */
   
   // 동기화 블록
   public void sum() {        // 메서드 안에 sysnchronized(this) { } 삽입
      syschronized(this) {
         for(int i = 0; i <= 100; i++) {
            total += i;
            System.out.println(Thread.currentThread().getName() + " : " + total);
         }
      }
   }
}
  • ThreadEx 클래스
public class ThreadEx extends Thread {
   Calc calc;
   
   ThreadEx(String name, Calc calc) {
      this.setName(name);
      this.calc = calc;
   }
   
   public void run() {           
      calc.sum();    => 1~100까지 더하는 메서드
   } 
}
  • 스레드 실행 클래스
public class ThreadMain {
   public stataic void main(String args[]) {
      Calc calc = new Calc();
      ThreadEx t1 = new ThreadEx("t1", calc);
      ThreadEx t2 = new ThreadEx("t2", calc);
   }
}
  • 실행 결과
t1 : 1
t1 : 3
t1 : 6
...
t1 : 5050
t2 : 1
t2 : 3
t2 : 6
...
t2 : 5050

0개의 댓글