백엔드

자바 synchronized 개념정리

ParkIsComing 2022. 7. 24. 08:56

개념

  • 멀티쓰레드 환경에서 여러 쓰레드가 동일한 자원을 참조할 수 있을 때, 해당 공유자원에 대한 동시접근을 막아주는 것이 synchronized이다.
  • 여러 쓰레드가 경쟁가능한 자원을 사용하는 영역을 critical section이라고 하는데, 하나의 쓰레드가 이 critical section에 접근할 때 synchronized를 사용하면 lock을 걸어 다른 다른 쓰레드의 접근을 막을 수 있다.
  • critical section을 사용중인 쓰레드를 제외한 다른 쓰레드들은 lock이 풀릴 때까지 기다리게 하는 방식으로 동시접근의 순차화가 가능하다.

사용

synchronized는 다음과 같이 사용되어 다양하게 lock의 범위를 설정한다.


1. 메서드에 synchronized 키워드를 추가

  • 그 메서드가 포함된 객체(this)가 lock의 대상이 된다.

단점: 객체에 lock이 걸리기 때문에 lock이 필요없는 멤버 변수에 대해서도 자유로운 접근이 불가능하다.

 

synchronized void print(String text){
  //생략
  for(int i-0; i<text.length;i++){
  System.out.print(text.charAt(i));
  }
}

2. 블록에 `synchronized` 키워드를 추가

  • 괄호 안에 인자로 넣는 객체가 lock의 대상이 된다.
void execute(String text){
    //생략
    synchronized(this){
        //생략
        for(int i-0; i<text.length;i++){
            System.out.print(text.charAt(i));
        }
    }

}

결론

critical section은 여러 쓰레드가 동시에 접근할 수 없기 때문에 멀티쓰레드 프로그램의 성능에 영향을 끼친다. 따라서 synchronized를 사용한 critical section은 최대한 좁은 범위로 제한하여 사용하는 것이 효율적이다.