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