[Java] Synchronized

한결·2023년 8월 17일

Java

목록 보기
3/5

Synchronized란?

현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근 할 수 없도록 막는 개념

  • 멀티스레드 환경에서 반드시 고려해야할 점인 스레드간 동기화라는 문제 해결 방법 중 하나
  • 현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근 할 수 없도록 막는 개념
    • 한 시점에 오직 하나의 쓰레드만이 동기화된 인스턴스 메소드를 실행할 수 있음
  • Synchronized 키워드는 변수와 함수에 사용해서 동기화 할 수 있음
  • Synchronized 키워드를 너무 남발하면 오히려 프로그램 성능저하를 일으킬 수 있음
    • Synchronized 키워드를 사용하면 자바 내부적으로 메서드나 변수에 동기화를 하기 위해 block과 unblock을 처리하게 되는데 이런 처리들이 만약 너무 많아지게 되면 오히려 프로그램 성능저하를 일으킬 수 있음

스레드간 서로 공유하고 수정할 수 있는 data가 있는데 스레드간 동기화가 되지 않은 상태에서 멀티스레드 프로그램을 돌리면, data의 안정성과 신뢰성을 보장할 수 없음

따라서, data의 thread-safe를 하기 위해 자바에서는 synchronized 키워드를 제공해 스레드간 동기화를 시켜 data의 thread-safe함


예시

  • synchronized 키워드는 다음 네 가지 유형의 블록에 쓰임
  1. 인스턴스 메소드

    • 인스턴스 당 한 쓰레드
  2. 스태틱 메소드

    • 객체 당 한 쓰레드
  3. 인스턴스 메소드 코드블록

    • 동기화가 반드시 메소드 전체에 대해 이루어져야 하는 것은 아님
  4. 스태틱 메소드 코드블록

    • 동기화가 반드시 메소드 전체에 대해 이루어져야 하는 것은 아님
// 1.

public synchronized void add(int value){

      this.count += value;

}

// 2. 

public static synchronized void add(int value){

      count += value;

}

 

 

// 3. 


 public class MyClass {

  

    public synchronized void log1(String msg1, String msg2){

       log.writeln(msg1);

       log.writeln(msg2);

    }

 

  

    public void log2(String msg1, String msg2){

       synchronized(this){

          log.writeln(msg1);

          log.writeln(msg2);

       }

    }

  }
  
  // 4. 
  
   public class MyClass {

 

    public static synchronized void log1(String msg1, String msg2){

       log.writeln(msg1);

       log.writeln(msg2);

    }

 

  

    public static void log2(String msg1, String msg2){

       synchronized(MyClass.class){

          log.writeln(msg1);

          log.writeln(msg2);  

       }

    }

  }

1개의 댓글

comment-user-thumbnail
2023년 8월 17일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기