본문 바로가기
JAVA

[Java] synchronized 와 임계구역

by 박졔삐 2024. 10. 7.

 

[ Synchronized ]

 

synchronized는 자바에서 멀티스레딩 프로그래밍 시 데이터의 일관성을 보장하기 위해 사용되는 키워드이다. 여러 스레드가 동시에 동일한 자원에 접근할 때 발생할 수 있는 문제를 해결하는 데 도움을 준다.

 

synchronized의 주요 개념:

  1. 임계 구역 (Critical Section):
    •     여러 스레드가 동시에 접근할 수 있는 코드 블록을 의미한다. 이 구역에 대한 접근을 제어하여 데이터의 무결성을 유지한다.
  2. 사용 방법:
    • 메서드 수준 : synchronized를 메서드 선언 앞에 붙여 사용한다. 이 경우, 해당 메서드는 한 번에 하나의 스레드만 실행할 수 있다.
      public synchronized void someMethod() {
          // 임계 구역
      }
       
    •  블록 수준 : 특정 코드 블록만 동기화할 수 있다. 이 경우, synchronized 블록 내에서 특정 객체를 지정한다.
      public void someMethod() {
          synchronized (someObject) {
              // 임계 구역
          }
      }
       
    •     모니터 락 (Monitor Lock) : synchronized 키워드를 사용하면 해당 객체에 대한 모니터 락을 획득한다. 다른 스레드는 이 락이 해제될 때까지 해당 코드 블록에 접근할 수 없다.
  3. 성능:
    •     동기화는 스레드 안전성을 보장하지만, 과도하게 사용하면 성능 저하를 초래할 수 있다. 따라서 필요한 경우에만 사용해야 한다.

 

예제 :

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

 

 

 


 

 

[ 임계 구역 (Critical Section) ]

 

 

임계 구역(Critical Section)은 여러 스레드가 동시에 접근할 수 있는 코드의 일부를 의미한다. 이 구역은 공유 자원(예: 변수, 데이터 구조 등)에 대한 접근을 포함한다. 여러 스레드가 동시에 이 임계 구역에 들어가면 데이터의 무결성이 손상될 수 있기 때문에, 이 구역에 대한 접근을 제어해야 한다.

 

임계 구역의 필요성:

  1. 데이터 무결성 : 여러 스레드가 동시에 공유 자원을 수정할 경우, 예기치 않은 결과를 초래할 수 있다. 예를 들어, 두 스레드가 동시에 같은 변수를 증가시키면, 예상보다 적은 횟수로 증가할 수 있다.
  2. 경합 상태 (Race Condition) : 여러 스레드가 동시에 자원에 접근하면서 발생할 수 있는 문제로, 이로 인해 프로그램의 예측할 수 없는 동작이 발생할 수 있다.

예제:

class Counter {
    private int count = 0;

    public void increment() {
        count++; // 임계 구역
    }

    public int getCount() {
        return count;
    }
}

 

위 코드에서 increment 메서드는 count 변수를 수정하는 임계 구역이다. 여러 스레드가 이 메서드를 동시에 호출하면, 서로의 작업을 방해할 수 있다.

 

 

동기화의 필요성 :

이 임계 구역에 대한 접근을 제어하기 위해 synchronized 키워드를 사용한다. 이를 통해 한 스레드가 임계 구역에 진입하면 다른 스레드는 해당 구역에 들어갈 수 없게 된다.

class Counter {
    private int count = 0;

    public synchronized void increment() { // 동기화
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

 

이렇게 하면 increment 메서드가 실행되는 동안 다른 스레드는 이 메서드에 접근할 수 없게 되어, 데이터 무결성을 유지할 수 있다.

 

728x90
반응형