Thread란 무엇일까?
스레드는 프로세스 내에서 실행되는 독립적인 흐름을 의미한다. 하나의 프로그램(프로세스)이 여러 작업을 동시에 할 수 있게 해주는 기능이다.
예를 들어, 음악을 들으면서 문서 작업을 할 때 각각의 작업이 스레드로 실행된다고 생각할 수 있다.
애플리케이션이 하나의 프로세스가 되고, 그 안에서 여러 개의 스레드가 할당받은 자원을 이용하여 실행 단위로 존재할 수 있다. 즉 스레드는 하나의 프로세스 안에서 여러 실행의 흐름이라고 생각하면 된다.
자바에서 Thread란?
자바에서 스레드는 Thread 클래스나 Runnable 인터페이스를 사용해 구현할 수 있다. Thread 클래스를 상속받아 직접 스레드를 생성하거나, Runnable 인터페이스를 구현한 클래스를 Thread 생성자에 넘겨서 스레드를 만들 수 있다.
자바의 스레드는 JVM이 제공하는 스레드 스케줄러에 의해 관리되며, 운영 체제의 스레드와 매핑된다. 그래서 자바 스레드는 플랫폼에 독립적으로 동작할 수 있다는 것이 큰 특징이다.
스레드를 사용하면 여러 작업을 병렬로 처리할 수 있어서, 응답 속도를 개선하고 자원 사용을 최적화할 수 있지만, 잘못 사용하면 데드락(Deadlock)이나 레이스 컨디션(Race Condition) 같은 문제가 발생할 수 있다.
+) 데드락(Deadlock)
두개 이상의 프로세스나 스레드가 서로 자원을 얻지 못해서 다음 처리를 하지 못하는 상태
즉, 무한히 다음 자원을 기다리게 되는 상태를 말한다.
+) 레이스 컨디션(Race Condition)
두 개 이상의 프로세스 혹은 스레드가 공유 자원을 서로 사용하려고 경합(Race)하는 현상을 의미한다.
웹 서버로 Thread 이해하기
웹 서버는 다수의 클라이언트 요청을 동시에 처리해야 한다. 이때, 각 요청을 처리하기 위해 여러 스레드를 생성하고, 각 스레드가 클라이언트 요청을 처리하도록 한다.
예를 들어, 클라이언트가 서버에 요청을 보낼 때마다 서버는 새로운 스레드를 생성해서 그 요청을 처리하고, 처리가 끝나면 스레드를 종료한다. 이렇게 하면 동시에 여러 클라이언트의 요청을 처리할 수 있게 된다. 하지만 스레드 생성 비용은 비싸기 때문에 요청마다 스레드를 생성하면 컨텍스트 스위칭 비용이 발생하여 응답 속도가 느려질 것이다.
그래서 서버에서는 스레드 풀(Thread Pool)이라는 개념을 사용한다. 스레드 풀은 미리 일정 수의 스레드를 생성해두고, 요청이 올 때마다 그 스레드를 재사용하는 방식이다. 이렇게 하면 자원 사용을 최적화하고, 스레드 생성/제거의 오버헤드를 줄일 수 있다.
자바 스레드의 생명 주기
자바 스레드는 여러 상태를 가지며 생명 주기 동안 상태가 변한다. 대표적인 상태는 New, Runnable, Blocked, Waiting, Timed Waiting, Terminated가 있다.
- New: 스레드 객체가 생성되었지만, 아직 start() 메서드가 호출되지 않은 상태.
- Runnable: start() 메서드가 호출된 상태로, 실행 가능하지만 실제 CPU 자원을 할당받아 실행 중인 상태는 아님.
- Blocked/Waiting/Timed Waiting: 스레드가 특정 조건에서 기다리는 상태. 예를 들어, 다른 스레드의 자원을 기다리거나, 일정 시간이 지날 때까지 기다려야 할 때.
- Terminated: 스레드의 실행이 종료된 상태.
스레드의 안전성
멀티 스레드 환경에서 여러 스레드가 공유 자원에 동시에 접근할 때, 자원의 일관성을 유지하기 위해 스레드 안전성이 필요하다. 자바에서는 synchronized 키워드나 ReentrantLock과 같은 여러 동기화 기법을 제공한다.
스레드 안전성을 보장하지 않으면 예상치 못한 결과가 발생할 수 있다. 예를 들어, 은행 계좌를 관리하는 프로그램에서 여러 스레드가 동시에 잔액을 업데이트하면, 잘못된 잔액이 표시될 수 있다.
결론
자바에서 스레드를 올바르게 사용하는 것은 성능 최적화와 관련된 중요한 기술이다. 하지만 동시에 스레드 안전성 문제를 염두에 두고 설계해야 한다.
'WEB' 카테고리의 다른 글
트랜잭션이란? (0) | 2024.09.05 |
---|---|
JUnit을 사용해서 Java 단위 테스트 하기 (0) | 2024.09.02 |
RDB와 NoSQL의 차이점 (3) | 2024.09.01 |
영속성 컨텍스트란? (1) | 2024.08.31 |
SubModule이란? (0) | 2024.08.28 |
배포 서버없이 프론트단과 백단 통신하기 (3) | 2024.08.27 |
HTML이 웹 브라우저에서 어떻게 작동할까? (1) | 2024.08.26 |
전략 패턴을 사용해 로그인 추상화 하기 (0) | 2024.08.08 |