99클럽 코테 스터디 15일차 TIL Java Multi-Thread 환경에서의 개발
728x90

란?

  • 여러 스레드가 동시에 실행되어 효율성과 성능을 높이는 프로그래밍 기법
  • Java 는 멀티스레딩을 지원하기 위해 여러 클래스와 인터페이스를 제공함.

1. Thread 클래스와 Runnable 인터페이스

  • Thread 클래스 상속 : Thread 클래스를 상속받아 run 메소드를 오버라이드 함.
  • Runnable 인터페이스 구현 : Runnable 인터페이스를 구현하고 인스턴스를 Thread 객체에 전달하여 스레드를 생성.

2. Thread 생명주기

  • New : Thread 가 생성되었지만 아직 시작되지 않은 상태
  • Runnable : 실행 가능한 상태로, 스케줄러가 이 스레드를 선택해 실행시킬 수 있음.
  • Blocked : 동기화된 블록에 의해 접근이 제한되어 실행을 기다리는 상태
  • Waiting : 다른 스레드의 특정 활동이 완료될 때까지 기다리는 상태
  • Timed Waiting : 지정된 시간 동안 기다리는 상태
  • Terminated : 작업이 완료되어 스레드가 종료된 상태

3. Synchronization(동기화)

  • 여러 스레드가 동시에 같은 객체의 멤버에 접근할 때 데이터 무결성 문제가 발생할 수 있음.
  • 이를 방지하기 위해 Java 에서는 synchronized 키워드를 사용해서 메소드나 블록을 동기화할 수 있음. 동기화된 블록이나 메소드는 한 번에 하나의 스레드만이 접근할 수 있어 데이터의 안정성을 보장함.

4. Thread Pool

  • Java 의 ExecutorService 인터페이스는 Thread Pool 을 관리하는 여러 메소드를 제공함. Thread Pool 은 작업을 수행할 Thread 의 집합을 미리 만들어 두고, 필요할 때마다 이를 재사용함. Thread 생성과 종료로 인한 오버헤드를 줄여줌

5. 데드락과 레이스 컨디션

  • 데드락 : 두 개 이상의 쓰레드가 서로의 자원을 기다리며 무한히 대기하는 상태.
  • 레이스 컨디션(Race Condition) : 두 개 이상의 스레드가 데이터를 동시에 수정하려고 할 때 발생하는 문제

6. Java Memory Model (자바 메모리 모델)

  • Java 메모리 모델은 Thread 가 변수를 어떻게 읽고 쓰는지 정의함.
  • volatile 키워드를 사용하면, 변수의 읽기와 쓰기가 메인 메모리에서 직접 이루어지도록 하여, 스레드간의 가시성을 보장함.

늘 그렇지만 잘 쓰면 좋은데, 못쓰면 문제점 많아짐.

728x90