쓰레드에 대해서는 저번에 알아봤습니다. 그러면 우리가 병렬연산을 해야할때 흔히들 사용하는 멀티쓰레드와는 어떤 관계인지, 어떤 차이점이 있는지 알아보겠습니다.
혹시나 저번 글을 못보신 분들은 아래 링크를 통해 보시면 됩니다.
멀티쓰레드(Multi Thread) 정의
말 그대로 여러개의 쓰레드를 의미합니다.
구조도
구조도에서 볼 수 있는것 처럼 프로세스 내부에 쓰레드는 여러개가 존재가 가능합니다.
쓰레드가 하나 인 경우는 단일 쓰레드, 여러개인 경우 멀티쓰레드라고 합니다.
그러면 멀티 쓰레드 자체는 어떻게 되어있는지 아래 구조도를 보겠습니다.
각자 쓰레드마다 레지스터와 스택은 할당을 받고 코드, 데이터, 파일 영역은 공유를 합니다.
스택의 대표적인 예시로 함수의 매게변수, 지역변수 등이 있으며
데이터 영역에서 대표적인 예시는 전역변수, 정적 변수 등이 있습니다.
해당 파트에 대해 설명은 아래 링크를 통해 확인하시면 됩니다.
힙? 스택? 메모리란 무엇일까 (tistory.com)
이렇게 글로만 보면 이해하기 힘들수도 있으니 예제 코드와 결과로 보겠습니다.
public class CSThread {
static String str = "hello?";
public void start(){
CustomThread thread1 = new CustomThread("thread1");
CustomThread thread2 = new CustomThread("thread2");
thread1.start();
thread2.start();
changeStr();
}
private void changeStr(){
Thread thread = new Thread(
() ->{
try{
Thread.sleep(2000);
str = "hi?";
}
catch (Exception e){
}
}
);
thread.start();
}
static class CustomThread extends Thread{
String name;
public CustomThread(String name){
this.name = name;
}
@Override
public void run(){
for(int i=0;i<3;i++) {
try {
Thread.sleep(1000);
System.out.println(this.name+" : static string : " + str);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
CustomThread는 생성할때 각자의 이름을 부여하고, 실행하면 별도의 쓰레드를 생성 후 3초간 1초마다 쓰레드 이름과 str 변수 값을 출력합니다.
changeStr은 2초 후 str 값을 hi? 로 변경하는 코드입니다.
여기서 각자의 이름은 스택 영역, str 변수는 데이터 영역입니다.
과연 실행 결과는 어떻게 나왔는지 확인해보겠습니다.
실행시간이 2초가 되어 실행되는 출력문에서는 hello?에서 hi?로 쓰레드1,2 모두 변경된 모습을 볼 수 있습니다.
즉 공유되는 값은 변경이 되면 쓰레드의 갯수, 번호와 상관없이 데이터가 반영이 되는걸 확인 할 수 있습니다.
또한 쓰레드 하나가 다 실행 후 다음 쓰레드가 실행이 되는것이 아닌 병렬로 동작하는 것을 확인 할 수 있습니다.
이 결과로 멀티쓰레드의 특징은 다음과 같습니다.
1. 멀티쓰레드는 병렬적으로, 비동기적으로 움직인다.
2. 공유하는 영역(코드, 데이터, 파일)이 변경이 될 경우 모든 쓰레드들이 영향을 받는다.
3. 스택 영역은 별도의 이벤트가 없으면 외부의 영향을 받지 않는다.
틀린 부분이 있으면 피드백은 언제든 환영입니다.
'개발잡담 > 공부' 카테고리의 다른 글
쓰레드(Thread)는 무엇일까? (feat. JAVA) (0) | 2023.09.08 |
---|---|
힙? 스택? 메모리란 무엇일까 (0) | 2023.09.07 |
Buffer란 무엇일까? (0) | 2023.09.06 |
DB에서 transaction이란 뭘까 (0) | 2023.08.10 |