Java에서 모니터란

Mohammad Irfan 2023년10월12일
  1. Java에서 모니터를 사용하지 않는 멀티스레딩 예제
  2. Java에서 모니터를 사용한 멀티스레딩 예제
Java에서 모니터란

이 튜토리얼에서는 모니터가 무엇이며 Java 프로그래밍에서 모니터를 사용하는 방법을 소개합니다.

모니터는 프로세스 동기화를 나타내는 용어입니다. 이것은 처음에는 운영 체제에서 사용되며 이제는 대부분의 프로그래밍 언어에서 사용합니다.

Java에서는 멀티스레딩 환경에서 프로세스 동기화를 달성하는 데 사용됩니다. 프로세스 간의 상호 배제를 달성하는 데 도움이 됩니다. 외부 프로세스는 모니터에 작성된 코드에 액세스할 수 없으므로 대기 상태가 발생하지 않습니다.

Java는 synchronized() 메소드를 사용하여 모니터를 생성하고 모든 객체가 모니터 역할을 할 수 있습니다. 모니터는 특정 데이터 항목/변수와 연관된 기능을 잠금으로 사용합니다. 스레드가 해당 데이터에 액세스하고 수정하려고 하면 모니터가 해당 프로세스를 제한하고 현재 스레드가 실행을 완료할 때까지 보류합니다.

몇 가지 예를 들어 모니터를 이해합시다.

Java에서 모니터를 사용하지 않는 멀티스레딩 예제

멀티스레딩 프로그래밍에서 모니터를 사용하지 않으면 어떻게 되는지 먼저 이해합시다. 이 예에서는 두 개의 스레드를 생성하고 실행했습니다. 스레드의 실행은 완전히 무작위이며 thread1 또는 thread2가 실행을 시작할 때마다 알 수 있습니다. 모니터의 경우 한 번에 하나의 스레드만 해당 코드를 실행할 수 있고 두 번째 스레드는 그 시간을 기다려야 하지만 여기서는 모니터를 사용하지 않아 결과가 완전히 엉망입니다. 아래의 예를 참조하십시오.

class MonitorDemo {
  void showMsg(String msg) { // synchronized method
    for (int i = 1; i <= 5; i++) {
      System.out.println(msg);
      try {
        Thread.sleep(500);
      } catch (Exception e) {
        System.out.println(e);
      }
    }
  }
}
class Thread1 extends Thread {
  MonitorDemo m;
  Thread1(MonitorDemo m) {
    this.m = m;
  }
  public void run() {
    m.showMsg("thread1");
  }
}
class Thread2 extends Thread {
  MonitorDemo m;
  Thread2(MonitorDemo m) {
    this.m = m;
  }
  public void run() {
    m.showMsg("thread2");
  }
}
public class SimpleTesting {
  public static void main(String args[]) {
    MonitorDemo obj = new MonitorDemo();
    Thread1 t1 = new Thread1(obj);
    Thread2 t2 = new Thread2(obj);
    t1.start();
    t2.start();
  }
}

출력:

thread1
thread2
thread1
thread2
thread1
thread2
thread1
thread2
thread1
thread2

Java에서 모니터를 사용한 멀티스레딩 예제

여기에서 이 예제에서 모니터를 만들고 showMsg() 메서드를 동기화된 것으로 표시했습니다. 따라서 한 번에 하나의 스레드만 이에 액세스할 수 있습니다. 이번에는 출력을 확인할 수 있습니다. 두 번째 스레드는 코드를 동기화하는 첫 번째 스레드를 완료한 후에야 실행을 시작하며 이것이 모니터의 이점입니다. 여러 스레드가 동일한 리소스를 요청할 때 멀티스레딩 프로그래밍에 유용합니다. 교착 상태나 기아 문제를 피하기 위해 이러한 시스템을 만들어야 합니다. 아래의 예를 참조하십시오.

class MonitorDemo {
  synchronized void showMsg(String msg) { // synchronized method
    for (int i = 1; i <= 5; i++) {
      System.out.println(msg);
      try {
        Thread.sleep(500);
      } catch (Exception e) {
        System.out.println(e);
      }
    }
  }
}
class Thread1 extends Thread {
  MonitorDemo m;
  Thread1(MonitorDemo m) {
    this.m = m;
  }
  public void run() {
    m.showMsg("thread1");
  }
}
class Thread2 extends Thread {
  MonitorDemo m;
  Thread2(MonitorDemo m) {
    this.m = m;
  }
  public void run() {
    m.showMsg("thread2");
  }
}
public class SimpleTesting {
  public static void main(String args[]) {
    MonitorDemo obj = new MonitorDemo();
    Thread1 t1 = new Thread1(obj);
    Thread2 t2 = new Thread2(obj);
    t1.start();
    t2.start();
  }
}

출력:

thread1
thread1
thread1
thread1
thread1
thread2
thread2
thread2
thread2
thread2