728x90
Thread-safe 하다는 의미와 설계하는 법을 설명해보세요.
Thread-safe란?
위키에서 Thread-Safe는
스레드 안전(thread 安全, 영어: thread safety)은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의한다.
라고 나와있다.
앞선 스터디에서 알게 되었듯이 스레드는 프로세스와 다르게 하나의 프로세스 안에서 여러 스레드가 같은 자원에 접근할 수 있고, 그 자원을 공유하며 작업(Task)을 처리한다.
그러니까, 여러 스레드가 동시에 같은 자원에 접근해서 그 자원을 사용하더라도 문제가 없는 것을 Thread-safe하다 라고 할 수 있다.
Thread-safe하게 설계하는 법
- 재진입성 (Re-entrancy)
어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다. - 상호 배제 (Mutual Exclusion)
공유 자원을 사용할 경우, 해당 자원에 대한 접근을 Semaphore와 같은 LOCK으로 통제한다.- 임계구역 (Critical Section)을 정의한다. 해당 임계구역은 한번에 하나의 스레드만 접근할 수 있도록 해야한다.
- Java에서는 syncronized를 사용하여 임계구역을 정의한다.
- 스레드 지역 저장소 (Thread-Local Storage)
공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소를 사용함으로써 동시 접근을 막는다.
이 방식은 동기화 방법과 관련되어있고, 공유 상태를 피할 수 없을 경우 사용한다. - 원자 연산 (Atomic Operation)
공유 자원에 접근할 때, 원자 연산 또는 원자적으로 정의된 접근 방법을 사용하여 상호 배제를 구현할 수 있다. - 불변 객체 (Immutable Object)
객체 생성 이후에 값을 변경할 수 없도록 만든다. (예. String)
프로세스 동기화에 대해 설명해보세요.
하나의 자원을 한 순간에 하나의 프로세스만 이용할 수 있게 제어하는 것!
728x90