본문 바로가기

Development/ETC

스레드 안전성이란?

Thread Safe 하게 코드를 작성하라


이 말은 곧 공유되고 변경할 수 있는 상태에 대한 접근을 관리 하는 것과 같다. '공유 되었다'는 것은 '여러 스레드가 특정 변수에 접근할 수 있다'라는 뜻이고 '변경할 수 있다'는 것은 말 그대로 '해당 변수의 값이 변경될 수 있다'는 말이다.

여러 스레드에서 수행되는 작업의 타이밍(race condition)이나 스케줄링에 따른 교차 실행과 관계 없이 불변조건이 유지 되어야 한다.

그러면 어떤 객체가 Thread Safe 해야 해?


이는 '객체가 어떻게 사용되는가?' 의 문제이지 '객체가 어떤 역할을 하느냐'와는 상관없다.

다시 말하면 '해당 객체에 여러 스레드가 접근할 가능성이 있는가? '의 문제이다.

스레드가 하나 이상의 상태 변수에 접근하고 그 중 하나라도 변수에 값을 쓴다면, 해당 변수에 접근할 때 모든 관련 스레드가 동기화를 통해 접근을 관리 해야한다.

예를 들면

  • 자바에서 동기화의 가장 기본적인 수단은  synchronized 키워드로써 배타적인 락을 통해 보호 기능을 제공

  • volatile, 명시적인 락, 단일 연산 변수(ex AtomicLong)를 사용