Thread

프로세스 내에서 실행되는 실행 단위

Thread

Thread


프로세스(Process)는 OS 에서 실행 중인 프로그램의 인스턴스이고, 스레드는 이 프로세스 내에서 실행되는 실행 단위로서, 한 번에 하나의 작업을 수행하는 것이 아니라 여러 작업을 동시에 처리할 수 있도록 해준다.

안드로이드의 스레드는 메인(UI) 스레드와 백그라운드 스레드로 나누어지며, 기본적으로 메인 스레드에서 실행된다.

하지만 메인 스레드에서 네트워킹이나 DB 액세스와 같이 시간이 오래 걸리는 작업을 수행하면 애플리케이션이 느려지거나 멈추는 등의 문제가 발생할 수 있기 때문에 백그라운드 스레드를 사용해서 메인 스레드와 별개로 작업을 수행해야 한다.

만약 메인 스레드가 UI 와 동기화되지 못하고 지연되는 문제가 발생하면 ANR(Android Not Responding)이 발생한다.

ANR 은 메인 스레드가 일정 시간 동안 작업을 처리하지 못하면 발생하는 에러로, 앱이 포그라운드 상태일 때 클릭, 터치 등의 UI 이벤트에 5초 이내 응답하지 못하면 발생한다.

이러한 문제점을 해결하기 위해 시간이 소요되는 연산 작업 등은 백그라운드 스레드를 따로 만들어서 처리해야 한다.


Thread Safety


스레드 안전성(Thread Safety)은 여러 스레드(동시 실행)를 다루는 데 있어 예측 가능한 동작을 보장하는 것을 말한다.

안드로이드 개발에서 스레드 안전성은 특히 중요한데, 메인 스레드와 백그라운드 스레드를 포함해서 다양한 작업을 수행하기 위해 여러 스레드의 실행이 자주 발생하기 때문이다.

동시에 여러 스레드가 동일한 데이터에 접근할 때(다중 스레드 환경에서) 데이터의 일관성이 유지되어야 하며, 만약 동시에 여러 스레드가 데이터에 접근해서 데이터의 일관성이 손상된다면 경쟁 조건(Race Condition)을 발생시켜 예측할 수 없는 결과가 발생할 수 있다.

경쟁 조건을 막기 위한 대표적인 방법으로는 synchronized 키워드를 사용해서 특정 코드 블록이 한 번에 하나의 스레드만 실행될 수 있도록 할 수 있다.

하지만 synchronized 를 남용하거나 잘못 사용하는 경우에는 성능에 영향을 미치는 오버헤드가 발생할 수 있다.

스레드 간의 전환이 필요한 경우 synchronized 블록 안에서 스레드가 대기하거나 블록을 벗어날 때 Context Switching 이 발생하는데, 이로 인해 스레드의 전환에 따른 오버헤드가 발생할 수 있다.

또한 synchronized 블록에 들어가거나 나올 때 마다 잠금과 해제 작업이 필요한데, 이로 인해 오버헤드가 발생할 수 있다.

이러한 오버헤드를 최소화하려면 synchronized 블록 내에서 수행되는 작업을 최소화하는 등의 방법을 고려해야 한다.

essential