본문 바로가기

WebStudy/JAVA

Thread (쓰레드) synchronized 동기화 -05

synchronized 를 걸어주지 않으면

작업이 끝나기전에 공유가 되어버려 예상할 수 없는 결과가 나온다.

이를 방지하기 위해 제공하는 기능이 동기화 synchronized 이다.

 

consol 결과 -----

3000000

 

ex------------------

public class ThreadCore_N07 {

 public static void main(String[] args) {
  Increment inc = new Increment();
  IncThread it1 = new IncThread(inc);
  IncThread it2 = new IncThread(inc);
  IncThread it3 = new IncThread(inc);

  it1.start();
  it2.start();
  it3.start();

  try {
   it1.join();
   it2.join();
   it3.join();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println(inc.getNum());

 }

}

class Increment {
 int num = 0;

 // 하나의 작업이 끝날때까지 공유를 하지 않도록 해주는 기능.
 // synchronized 를 걸어줘야 한다.
 // Method 동기화

//synchronized 를 빼고 실행하면 다른 결과를 볼 수 있다.
 public synchronized void increment() {
  num++;
  
  /*
   * Block 동기화
   * Method 동기화 보다 Block 동기화를 주로 사용함.
   * Method 동기화는 단위 자체가 크기때문에 성능이 떨어짐.
   * synchronized(this){
   num++;
  }*/
 }

 public int getNum() {
  return num;
 }
}

class IncThread extends Thread {
 Increment inc;

 public IncThread(Increment inc) {
  this.inc = inc;
 }

 public void run() {
  for (int i = 0; i < 1000; i++) {
   for (int j = 0; j < 1000; j++) {
    inc.increment();
   }
  }
 }
}