스레드 안전(thread 安全, 영어: thread safety)은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의한다.
synchronized 키워드를 붙이거나, synchronized 블록을 생성해서 구현할 수 있다.
태그가 붙거나 블록내의 함수 혹은 자원에 대해서는 동시성을 보장해준다.
HashMap, ConcurrentHashMap, AtomicInteger, BlockingQueue 등
각 쓰레드에는 각 쓰레드별 스택이 존재로한다.
따라서 모든 스레드는 각자 고유한 스택과 지역변수를 가진다는 특성을 잘 이해하면 동시성을 보장하도록 할 수 있다.
선언한 함수와 변수가 스택에서 나가게 되면 그 기록은 모두 사라진다. 이럴 경우 다른 곳에서 사용이 불가능하다. 이를 해결하기위해 Thread Local을 사용한다.
Thread local을 통해서 특정 쓰레드가 실행하는 모든 코드에서 그 쓰레드에 설정된 변수 값을 사용할 수 있게 된다.
대표적인 사용 예로 SpringSecurity에서 제공하는 SecurityContextHolder가 바로 ThreadLocal 적절한 예가 된다.
String은 안전하다. -> 불변객체이기 때문
적절한 final 키워드도 별다른 동기화작업이 없이도 동시성환경에서 자유롭게 사용할 수 있다.
불변객체와 비슷한관점으로 초기화된 이후에 변경될 수 없기 때문에 여러스레드가 동시에 접근해도 동일한 값을 보장받을 수 있기 때문이다.
https://sup2is.github.io/2021/05/03/thread-safe-in-java.html