99클럽 23일차 TIL: Thread (Java, Spring)

2024. 4. 26. 21:0999클럽/TIL

728x90
반응형

#1. 오늘의 학습 키워드

자바 스프링에서의 쓰레드에 대해

  • JS → 자바로 넘어오면서, 언어에 차이는 멀티쓰레드 유무라고 알고 있었다.
    • JS
      • 싱글 쓰레드
    • 자바
      • 멀티 쓰레드
  • 이에 대해서 디테일하게 알아보자

#2. 공부한 내용

1. Process

- 운영체제(os)에서 할당하는 작업의 단위
- 실행 중인 프로그램
  • 프로세스는 디스크 → 메모리 → CPU 의 할당을 받는 작업의 단위
  • 컴퓨터에서 실행 중인 프로그램으로 봐도 무방하다
  • 프로세스 끼리는 별도의 메모리 영역을 갖는다.

2. Thread

- 프로세스의 실행 최소 단위
  • 한 프로세스 내의 여러 쓰레드가 작업을 나누어서 실행을 한다.
  • 같은 프로세스 내 쓰레드 끼리는 자원 공유가 가능하다.
    • 공유되는 자원은 코드, 데이터, 파일 등이다.
  • 구조
    • 쓰레드 ID
      • 쓰레드의 식별자
      • 프로세스도 PID 가 있듯이 쓰레드도 ID 가 있음
    • Program Counter(PC)
      • 쓰레드의 명령어가 어디까지 수행 되었는 지 나타냄
      • 쓰레드의 실행은 중간에 끊길 수가 있기 때문에, 쓰레드는 instruction 실행이 어디까지 됐는 지 기억할 필요가 있다.
    • 레지스터
    • 스택
      • 함수 호출 시 parameter, 되돌아가는 포인터, 함수 내 변수 등을 저장하기 위한 메모리 공간
      • 스택은 쓰레드 별로 독립적임

3. 자바에서의 쓰레드

  • 자바에서는 JVM ( java virtual machine) 으로 하나의 프로세스를 실행하며, 멀티 쓰레드를 지원한다.
    • 즉 JVM 으로 쓰레드를 관리
  • 프로세스에는 적어도 하나의 쓰레드가 있으며, Main 쓰레드로부터 작업이 시작된다
    • 메인 쓰레드로 부터 자식 쓰레드가 생길 수 있다
    • 그리고 해당 메서드는 프로그램을 실행시킬 때 자동적으로 생성된다.
  • 만약 같은 프로세스 내 main 쓰레드 제외 다른 쓰레드가 추가 된다면, 멀티 쓰레드 환경이 되고, 이런 쓰레드 끼리는 프로세스의 리소스를 공유한다.

1) 생성자

  • Thread()
    • 쓰레드 객체 생성자
  • Thread(String name)
    • name 인자 값으로 이름을 붙인 쓰레드 객체 생성
  • Thread(Runnable target)
    • Runnable target 이 구현된 쓰레드 객체 생성
  • Thread(Runnable target)
    • 위 두 개 기능 combine

2) 메서드

  • void run()
    • 쓰레드의 실행 코드를 작성하는 메서드.
    • 해당 메서드를 override 해서 사용
  • long getId()
    • 쓰레드 id 반환
  • void interrupt()
    • 쓰레드 중지
  • void start()
    • 쓰레드가 시작되도록 요청하는 메서드
    • 쓰레드가 해당 메서드로 시작되면, run() 메서드가 실행됨
  • https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
    • 위 공식 문서에서 모든 쓰레드 메서드 확인 가능

3) 동기처리

  • 쓰레드에서 동기 처리는 중요하다.
  • 실행 순서가 중요한 부분일 경우, 멀티 쓰레딩에 의해 해당 순서가 꼬이면 안 되기 때문.
  • 동기 구현 방식
    • method 구현
    • block 구현
  • 주의할 점은 두 쓰레드에서 다른 객체로 실행을 하면, 동기 처리를 해도 동시에 작동을 한다.
    • 그와 다르게 두 쓰레드에서 하나의 객체에서 동기 실행 메서드를 호출하면, 먼저 호출된 쪽이 다 실행이 되고, 그 다음 호출된 쪽이 실행된다.
// -1- method
public synchronized void methodA(){
	//동기 처리 코드
}

// -2- block
synchronized(this){
	//동기 처리 코드
} 



#3. 오늘의 회고

  • 자바 개발에서 쓰레드는 동시성 및 병렬성을 구현하는 데 중요한 요소다.
    • 여러 작업의 동시 처리 및 프로그램 성능 향상에 일조하기 때문이다.
    • i/o 작업 및 네트워크 호출 등의 블로킹 작업을 별도의 쓰레드에서 처리하도록 하면, 대기 시간 최소화할 수가 있다.
  • 쓰레드를 사용하는 건 이점을 가져다 주지만, 동시에 잠재적 위험성도 있다.
    • 데드락 / 교착 상태 유발 가능
728x90
반응형