Categories: Java 언어Korean

Java 총 정리[94. 쓰레드 임계영역]

쓰레드 임계영역

이전 걸음에서 쓰레드의 동기화에 대해서 같이 공부를 했습니다. 동기화에 대한 전반적인 내용을 공부하고 필요성에 대해서도 아셨을 것이라고 생각을 합니다. 그럼 Java에서 많이 사용하는 동기화 방식을 이번 걸음에서 같이 보도록 하겠습니다.

쓰레드 임계영역을 이번 걸음에서 같이 공부를 할 예정입니다. Java에서는 임계영역을 많이 사용을 합니다. 임계영역은 여러 쓰레드들이 사용하는 영역이라고 생각을 하면 됩니다. 그 영역의 사용 방법이나 동작 원리 이해를 해야 합니다.

쓰레드 임계영역이 무엇인지, 사용 방법과 예제를 통해서 이번 걸음에서 쓰레드의 임계영역에 대해서 공부를 하도록 하겠습니다. 어려운 내용일 수 있지만 같이 한다면 분명 이해하고 사용을 하실 수 있습니다.

쓰레드 임계영역 이란?

위의 사진처럼 쓰레드 임계영역은 쓰레드가 접근 가능한 영역으로 쓰레드가 영역에 접근을 해서 기능 동작이 된다. 단, 임계영역이기 때문에 쓰레드는 꼭 하나의 쓰레드만 접근을 해야 한다. 여러 쓰레드가 동시에 들어가려고 해도 한명이 들어가고 나머지는 기다렸다가 쓰레드가 끝나고 나오면 들어갈 수가 있다. 

※ 일반적으로 공중 화장실을 떠올려보면 임계영역의 이해를 높일 수 있습니다.

위의 사진처럼 임계영역에 쓰레드가 진입을 하면 Lock을 걸어 임계영역을 잠그고 쓰레드가 나가게 되면 UnLock으로 임계영역을 열어주게 됩니다. 이런 동작으로 하나의 쓰레드만 접근을 할 수 있게 해줍니다.

임계영역은 Method가 됩니다. 그리고 메소드에 임계영역이라는 것을 알려주기 위해 Synchronized을 붙혀서 Method를 만듭니다.

※ 임계영역은 하나의 쓰레드만 들어올 수 있는 것만 보장을 합니다. 순서 보장이 되는 것은 아닙니다. 예를 들어 하나의 쓰레드가 동작을 다하고 나오면 기다리던 쓰레드가 동작이 되지만 다시 임계영역에 들어간 쓰레드가 빠르게 다시 임계영역에 줄을 서면 동작을 할 수도 있습니다. 한마디로 연달아서 같은 쓰레드가 동작을 할 수 있습니다.

쓰레드 임계영역 예제

    
class A{
 synchronized void plus(int i) {
  System.out.println(i);
 }
}
class B extends Thread{
 A a;
 int i ;
 B(A a, int i){
  this.a = a;
  this.i = i;
 }
 public void run() {
  for(int j = 0;j<5;j++) {
   a.plus(j*i);
   try {
    Thread.sleep(400);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
}
public class ExThread2 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  A a = new A();
  B b1 = new B(a,3);
  B b2 = new B(a,7);
  b1.start();
  b2.start();
 }

}

    

위의 소스를 보면 임계영역 없이 동작을 한 것 같지만 임계영역으로 하나의 쓰레드만 들어가는 규칙을 지키고 동작을 한 것입니다. 꼭 이 부분을 이해하고 하나의 데이터를 변경을 한다면 아무리 여러 쓰레드가 값을 바꿔도 임계영역에 들어간 횟수에 맞게 값이 변경이 되어 있을 것입니다.

Dolphin

Recent Posts

Java 총정리[97. Java GUI]

Java GUI Java GUI에 대해서 이번 걸음에서 배움으로써 GUI에 전반적인 지식과 Java GUI를 구현하는 방법…

7개월 ago

Java 총정리[96. Java TCP 통신 프로그램 구현]

Java TCP 통신 프로그램 구현 Java TCP 통신 프로그램 구현을 위해서 이전 걸음에서 쓰레드에 대한…

7개월 ago

Java 총정리[95.쓰레드 통신]

쓰레드 통신 이전 걸음에서 쓰레드의 임계영역에 대해서 같이 공부를 했습니다. 동기화에 대한 개념을 계속적으로 하고…

7개월 ago

Java 총 정리[93. 쓰레드 동기화]

쓰레드 동기화 이전 걸음에서 계속 쓰레드에 대해서 공부를 하고 있습니다. 쓰레드는 상당히 중요한 개념이기 때문에…

8개월 ago

Java 총 정리[92. 쓰레드 join()]

쓰레드 join() 이전 걸음에서 쓰레드의 전반적인 실행 흐름에 대해서 공부를 했습니다. 이제 배운 실행 흐름…

8개월 ago

Java 총 정리[91. 쓰레드 실행 흐름]

쓰레드 실행 흐름 이전 걸음에서 쓰레드에 기본적인 내용을 공부를 했습니다. 쓰레드는 사용을 하는 것이 상당히…

9개월 ago

This website uses cookies.