스레드 (Thread)

Q. 스레드(Thread)란 무엇이며 어떤 특징이 있나요?

스레드는 프로세스 내에서 실행되는 실행 단위로서 프로세스에 할당된 자원(Code, Data, Heap)을 다른 스레드와 공유합니다. 이러한 특징으로 인해 공유 자원에 여러 스레드가 접근하게 될 경우 Race Condition(경쟁 상태)가 발생할 수 있습니다. 예를 들어, 두 스레드가 동시에 count 값을 증가시키려고 할 때 예상치 못한 결과가 발생할 수 있습니다. 또한, Deadlock(교착 상태)가 발생할 수 있는데 두 개 이상의 스레드가 서로 자원을 점유한 상태로 다른 스레드의 자원에 접근하려할 때 계속해서 대기하는 상태를 말합니다.

Q. 그런 문제를 자바에서는 어떻게 처리할 수 있나요?

주로 synchronized 키워드를 사용하거나, java.util.concurrent 패키지 하위에 존재하는 Thread-safe한 자료구조를 사용합니다.

synchronized 키워드 같은 경우 메서드에 사용하여 메서드를 임계구역으로 설정하여 해당 메서드에 접근할 수 있는 스레드를 단 한개만을 보장합니다. 하지만, 메서드 전체를 동기화하는 것은 비용적으로 문제가 될 수 있어 메서드 내부에 synchronized(this) 와 같이 메서드의 일부만 동기화하는 방식을 사용할 수 있습니다.

Thread-safe 자료구조에 대해 가장 많이 설명이 되는 자료구조는 HashMap vs Hashtable vs ConcurrentHashMap 세 자료구조를 비교합니다. HashMap의 경우 멀티 스레드 환경에서 안전하지 않고, Hashtable, ConcurrentHashMap은 안전하다고 하는데 그 이유는 데이터 관련 함수(get, put, remove 등)에 thread-safe하게 동작하도록 구현이 되어있기 때문입니다. Hashtable은 synchronized 키워드를 메서드 레벨에 작성하여 동시성을 보장하고 있지만, 성능적으로 문제가 되어 개선하기 위해 ConcurrentHashMap이 탄생하게 되었습니다. ConcurrentHashMap은 Hashtable처럼 메서드에 synchronized 키워드가 없지만 메서드 내부에 부분적으로 synchronized를 사용하며 해시 테이블 버킷을 독립적으로 Locking 하는 방식을 사용합니다.

추가적으로 공부할 것!

ThreadLocal
ReentrantLock

Last updated