스레드-안전(Thread-safe)과 재진입가능(Reentrant)의 차이

다중 스레드 프로그래밍을 하다 보면, 스레드-안전(Thread-safe)과 재진입가능(Reentrant)이란 용어를 보게 된다. 처음에는 이 두 용어에 대한 개념이 명확하지 않게 느껴지지만, 명확한 차이가 있다. 우선 이 두 개념에 대한 정의를 살펴보자.

1. 스레드-안전(Thread-safe) 정의
스레드 안전은 다중 스레드가 동시에 같은 로직을 실행하는 경우에도 결과가 정확함을 보장한다는 것이다. 따라서 여러 스레드가 클래스에 접근할 때, 실행 환경이 해당 스레드들의 실행을 어떻게 스케줄 하든 어디에 끼워 넣든, 호출하는 쪽에서 추가적인 동기화나 다른 조율 없이도 정확하게 동작하면 해당 클래스는 스레드 안전하다고 말한다.

2. 재진입가능(Reentrant) 정의
재진입가능은 다중 스레드가 동시에 같은 로직을 실행할 수 있도록 구현해서 스레드-안전을 확보하는 형태이다.

위에서 정의한 내용을 토대로, 재진입가능한 로직은 스레드-안전을 확보해서, 스레드-안전을 확보하는 하나의 수단이 된다. 하지만 스레드-안전을 확보하는 수단은 재진입가능한 로직외에도 여러 동기화 기법이 있다.

자바에서 스레드-안전한 로직을 구현하는 방법은 다음과 같다.
– Atomic 시리즈의 클래스 사용
– 뮤텍스 사용
– 세마포어 사용
– 아래의 재진입가능한 로직을 구현한 형태 사용

자바에서 재진입가능한 로직을 구현한 형태는 다음과 같다.
– 암시적인 락 : 기본적으로 자바 객체는 모니터 락을 가지고 있고, 이것으로 재진입가능한 로직의 형태로 사용할 수 있다.
– ReenterantLock과 ReentrantReadWriteLock의 사용

* Reference
– 자바 병렬 프로그래밍

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.