본문 바로가기

삽질하기/JAVA

synchronized(this)와 synchronized(.class)의 차이점

반응형

import java.io.*;

public class SynchronizedEx01 extends Thread {
   static int count;
   public void run() {
      for (int i=0; i<5; i++) {
         synchronized(this) {//this
         //synchronized(SyncTest.class) {//.class
         counter();
      }
      try {
         Thread.sleep(100);
      } catch (InterruptedException e) {}
   }

   public void counter() {
      System.out.println(Thread.currentThread().getName() + " : " + count);
      ++count;
   }

   public static void main(String[] args) throws IOException {
      SynchronizedEx01 t1 = new SynchronizedEx01();
      SynchronizedEx01 t2 = new SynchronizedEx01();
      t1.start();
      t2.start();

   }
}

this는 객체 인스턴스에 대한 동기화
여러개의 쓰레드객체를 생성하는 경우에는 t1, t2가 서로 다른 this를 가지기 때문에
t1, t2의 동기화는 안 된다.

.class에 대한 동기화는 class자체에 대한 동기화
따라서 .class를 통해서 생성하는 모든 쓰레드에 대해 동기화가 이루어진다.