두 개 이상의 스레드가 Race Condition에 들어가거나 같은 객체에 동시에 접근해도 연산결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태를 의미한다.
자바에서 Thread-safe한 설계를 위해서
java.util.concurrent
패키지 하위 클래스를 사용한다.Singleton 패턴
을 사용한다. (참고)Singleton 패턴
동기화(syncronized) 블록
에서 연산을 수행한다.멀티 스레드 프로그래밍에서 어떤 함수나, 변수, 혹은 객체가 어떤 스레드로부터 동시에 접근이 이루어져도 문제가 생기지 않는다는 것을 의미한다.
- 여러곳에서 동시에 접근하더라도 그 결과가 올바르다는 것을 의미합니다
📌재진입성 (Re-entrancy)
어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.📌상호 배제 (Mutual Exclusion)
공유 자원을 사용할 경우, 해당 자원에 대한 접근을Semaphore
와 같은LOCK
으로 통제한다.
임계구역 (Critical Section)
을 정의한다. 해당 임계구역은 한번에 하나의 스레드만 접근할 수 있도록 해야한다.- Java에서는
syncronized
를 사용하여 임계구역을 정의한다.📌스레드 지역 저장소 (Thread-Local Storage)
공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소를 사용함으로써 동시 접근을 막는다.
이 방식은 동기화 방법과 관련되어있고, 공유 상태를 피할 수 없을 경우 사용한다.📌원자 연산 (Atomic Operation)
공유 자원에 접근할 때, 원자 연산 또는 원자적으로 정의된 접근 방법을 사용하여 상호 배제를 구현할 수 있다.📌불변 객체 (Immutable Object)
객체 생성 이후에 값을 변경할 수 없도록 만든다. (예. String)
프로그래밍에서 데이터의 변경이 동시에 일어난 것처럼 보이게 하는 것을 의미한다.
데이터의 값을 변경하는 것은 항상 변경에 대한 시간이 필요하다. Atomic한 데이터에 변경이 이루어지는 시간에 LOCK을 걸어 다른 접근을 막는다.
프로퍼티가 atomic 하다
는 의미
멀티 스레드 환경에서 데이터에 접근할 때, 해당 데이터의 변경 전/후 상황에서만 접근하는 것을 보장한다는 의미이다.
즉, 데이터의 변경이 이루어지는 순간에는 접근이 불가능하다.Non-Atomic
반환된 값에 대해 보장하지 않는다. 정확하거나 쓰레기 값일 수 있다.