- 스레드에 안전한 코드를 작성하는 것은 근본적으로는 공유되고 변경할 수 있는 상태에 대한 접근을 관리하는것이다.
- 인스턴스나 static 변수는 공유되기 때문에 여러 스레드가 특정 변수에 접근할 수 있고 변경할 수 있다.(mutable)
- 스레드 안전성은 코드를 보호하는 것처럼 보이지만 실제로는 데이터에 대한 제어 없이 동시 접근을 막기 위함이다.
- 자바에서 동기화를 위한 기본 수단은 synchronized 키워드로 배타적인 락을 통해 보호적인 기능을 제공한다. 하지만 volatile, 명시적 락, 단일 연산 변수(atomic variable)를 사용하는 경우에도 ‘동기화’라는 용어를 사용한다.
공유된 상태 변수를 사용할 때 잘못된 프로그램을 고치는 방법 3가지
- 해당 상태 변수를 스레드 간에 공유하지 않거나
- 해당 상태 변수를 변경할 수 없도록 만들거나
- 해당 상태 변수에 접근할 때 언제나 동기화를 사용한다.
애당초 스레드에 안전하게 설계하는 편이 좋다.
- 객체 지향 프로그래밍 기법에서 사용하는 캡슐화나 데이터 은닉(data hiding) 같은 기법이 스레드에 안전한 클래스를 작성하는 데도 도움이 될 수 있다.
- 스레드 안전한 클래스로만 구성된 프로그램이 스레드 안전하지 않을 수 있다.
1. 스레드 안전성이란?
- 스레드에 대한 납득할 만한 정의의 핵심은 모두 정확성(correctness) 개념과 관계 있다. 여러 스레드가 클래스에 접근할 때 계속 정확하게 동작하면 해당 클래스는 안전하다.
<aside>
💡 여러 스레드가 클래스에 접근할 때, 실행 환경이 해당 스레드들의 실행을 어떻게 스케줄하든 어디에 끼워 넣든 호출하는 쪽에서 추가적인 동기화나 다른 조율 없이도 정확하게 동작하면 해당 클래스는 스레드 안전한다고 말한다.
</aside>
<aside>
💡 상태 없는 객체는 항상 스레드 안전하다.
</aside>