객체 지향 프로그래밍/Java

스레드 - 멀티 스레드와 멀티 프로세스 쉽게 구분하기

ghtis1798 2020. 12. 27. 13:50

동시에 여러 작업을 처리하는 방법

스레드 / 프로세스

1. 멀티 태스킹

 

멀티 태스킹이란 동시에 여러 가지 작업을 수행하는 것을 말합니다.

병렬로 일을 처리하는 것을 의미하죠.

이를 구현하기 위한 방식에는 두 가지 방식이 있습니다.

 

2. 멀티 스레드와 멀티 프로세스

 

멀티 스레드(Multi-Thread)하나의 프로그램이 여러 개의 작업을 수행하도록 합니다.

각 작업을 스레드(Thread)라고 하며 스레드는 동일한 자원을 공유합니다.

정확히는 Static 영역과 Heap 영역을 공유합니다.

스레드는 Stack영역을 서로 분할해서 사용합니다.

따라서 스레드간 Stack 영역을 접근할 수 없지만 Static영역과 Heap영역을 공유합니다.

스레드 사용 시 메모리 공간

우리는 Static 공간에 클래스의 멤버 변수(=전역변수, 필드, 속성, Property)들이 저장된다는 것을 알고있습니다.

또한 Heap 공간에는 객체와 객체 변수들이 저장되어 있다는 것도 알고 있죠. 👌

스레드를 사용했을 때 좋은 성능을 낼 수 있는 경우는 언제일까요? 🤔

웹프로그래밍에서 스레드를 효율적으로 사용할 수 있습니다.

웹 서버에서 각 클라이언트를 별도의 스레드로 처리할 수 있기 때문이죠.

그럼 멀티 프로세스(Multi-Process)는 무엇일까요?

멀티 프로세스도 멀티 태스킹이 가능합니다.

하지만 프로세스별로 별도의 메모리 공간을 갖는다는 점이 스레드와 다릅니다.

프로세스 사용 시 메모리 공간

딱 봐도 멀티 프로세스는 메모리 공간이 많이 필요할 것 같습니다.

 

3. 스레드 구현 시 주의할 점

 

자바에서는 두 가지 방식으로 스레드를 생성합니다.

Thread 클래스를 상속하거나 Runnable 인터페이스를 구현해야 합니다.

상속해서 먼저 구현해 보았습니다.

스레드를 하나만 실행시켰을 때는 간섭이 발생하지 않습니다.

하지만 여러 개의 스레드를 동시에 돌리게 되면 문제가 생깁니다.

예를 들어 공유 변수를 1증가 시킨 후 바로 감소시키고 출력하면 어떨까요? 🤔

0이 출력되겠죠. 하지만 여러 스레드가 하나의 변수를 갖고 반복하면 다른 결과가 출력됩니다.

class MyThread extends Thread {
    static int share=0;

    public void run() {
        for(int i=0; i<100; i++) {
            increase();
            decrease();
            System.out.println(share+" ");    

            try {sleep(1000);}
            catch (InterruptedException e) {}
        }
    }

    public void increase() {
        share++;
    }
    public void decrease() {
        share--;
    }
}

public class ThreadTest{
    public static void main(String[] args) {
        Thread t1 = new MyThread();
        Thread t2 = new MyThread();
        Thread t3 = new MyThread();
        Thread t4 = new MyThread();
        Thread t5 = new MyThread();

        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }
}

결과

0이 출력되다가 -1이 출력되기도하고 경우에 따라선 1이 출력되기도 합니다.

따라서 스레드 간 간섭을 피하기 위해서 Lock을 걸어 사용하기도 합니다.

 

참고 - 김종민 저, 스프링 입문을 위한 자바 객체 지향의 원리와 이해