스레드 안전하지 않으므로 SimpleDateFormat을 예로 들어 보겠습니다.volatile vs Java의 threadLocal
나는 각 스레드가 SimpleDateFormat에의 복사본이 같은 ThreadLocal를 사용하도록 허용 할 수 있습니다 :
private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
그러나 휘발성 키워드 보장 스레드 변수의 최신 복사본을 것입니다. 그래서 대신이 작업을 수행 할 수 있습니까?
volatile SimpleDateFormat myformatter;
동일한 스레드 안전성을 얻을 수 있습니까?
스레드 안전성 문제가 발생하지 않기 때문에 스레드 안전성 문제는 'SimpleDateFormat'이 참조가 휘발성 필드에 저장되어 있는지 여부와 관계없이 변경할 수있는 상태입니다. –
스레드 로컬과 '휘발성'은 동일하지 않습니다! 스레드 로컬의 경우 각 스레드에 대한 변수의 별도 사본이 있습니다. '휘발성'으로 모든 스레드는 하나의 변수를 공유합니다. Andy가 언급했듯이,'SimpleDateFormat'은 다중 스레드에 의해 동시에 업데이트되어서는 안되는 내부 상태를 가지기 때문에 변수를 volatile로 설정하면 스레드로부터 안전하지 않습니다. – Jesper