본문 바로가기

Java

Thread Safe

반응형

Thread safe 란,

멀티 thread 프로그래밍에서 여러 쓰레드로부터 동시에 접근이 이뤄져도 프로그램의 실행에 문제가 없음을 뜻합니다.

하나의 함수가 한쓰레드에서 호출되어 사용중일때 다른 쓰레드가 그 자원을 동시에 함께 사용하더라도 각 쓰레드에서 함수의 수행 결과가 올바로 나옵니다.

 

위키피디아 정의에 따르면,

"Thread-Safe는 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻합니다. 보다 엄밀하게는 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의합니다. " 

 

 

 

Thread-safe 보장을 위한 방법

1. Mutual exclusion

상호배제란, 한 Thread가 자원에 접근할 때 다른 Thread의 접근을 막는 것을 의미합니다.

공유 자원을 사용해야할 경우 해당 자원의 접근을 semaphore 등의 락으로 통제합니다.

즉, Critical Section을 정의해서 Critical Section은 한번에 하나의 스레드만 접근할 수 있도록 해야합니다.

Java 에서는 synchronized를 사용합니다.

 

2. Re-entrancy

어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 결과가 각각에게 올바로 주어져야 합니다.

 

3. Thread-local storage

공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막습니다.

 

4.Atomic operations

공유 자원에 접근할 때 원자 연산을 이용하거나 '원자적'으로 정의된 접근 방법을 사용함으로써 상호배제를 구현할 수 있습니다.

 

 

Java 에서는 PriorityQueue는 thread unsafe 인스턴스입니다.

따라서 멀티쓰레드 환경에서는 PriorityBlokcingQueue를 사용해야합니다.

반응형

'Java' 카테고리의 다른 글

equals, hashCode  (0) 2020.12.21
Refresh Token  (0) 2020.12.15
컴파일 과정  (0) 2020.09.18
HashMap & HashSet  (0) 2020.09.16
Content-Type  (0) 2020.07.14