
멀티 스레드 환경에서 변수, 객체나 함수 등의 자원이 여러 스레드에 의해 동시에 접근되어도 프로그램이 정상적으로 동작하는 상태를 스레드 세이프하다고 말한다.
즉, 여러 스레드가 같은 객체나 데이터를 사용할 때, 그 객체나 데이터가 일관성을 유지하도록 보장되는 프로그래밍의 속성
public class NoThreadSafeClass {
private int result = 0;
public int getResult()
{
for (int i = 0; i< 100 ; i++){
result = result + 1;
}
return result;
}
}
싱글 스레드 환경에서는 문제가 없지만, 멀티 스레드 환경에서는 전역변수(result)를 공유하기 때문에 문제가 발생할 수 있다.
public class ThreadSafeClass {
private int result = 0;
public synchronized int getResult()
{
for (int i = 0; i< 100 ; i++){
result = result + 1;
}
return result;
}
}
synchronized를 사용하여 동시에 result값을 증가시키지 못하게 하는, Thread-safe한 환경이다.
즉, 여러 스레드가 함수를 호출해서 동시에 실행되는 환경(멀티스레드)이더라도 임계 영역의 자원은 특정 시점에서 하나의 스레드만이 접근 가능하여 함수의 수행 결과가 서로 간섭하지 않고 정상적으로 나오는 상태이다.