스레드 안전은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로 부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다.
여러 스레드가 클레스에 접근할 때, 실행 환경이 해당 스레드들의 실행을 어떻게 스케쥴하든 어디에 끼워 넣든, 호출하는 쪽에서 추가적인 동기화나 다른 조율없이도 정확하게 동작하면 해당 클래스는 스레드 안전하다고 말한다.
여러 스레드가 변경할 수있는 하나의 상태 변수를 적절한 동기화 없이 접근하는 경우
해당 변수를 접근 하는 메서드 또는 해당 객체를 Synchronized 키워드를 사용하여 하나의 스레드만 해당 자원을 사용할 수 있도록 Blocking을 한다. 또는 동기화 블록을 생성헤 메소드안의 동기화 블럭을 따로 작성한다.
멀티 스레드 환경에서는 각 스레드에서 Main Memory에서 읽은 변수값을 CPU Cache에 저장하게 된다.
따라서 변수 값 불일치 문제가 발생할 가능성이 생긴다. volatile 키워드를 사용하면 Main Memory에 저장하고 읽어오기 때문에 변수값 불일치 문제가 해결 될 수 있다.
멀티 스레드 환경에서 non-blocking을 하며, 원자성을 보장하기 위해 나온 개념
CAS(Compare And Swap) 알고리즘을 사용하여 동작한다.
동작 원리는 다음과 같다.