В качестве примера возьмем SimpleDateFormat, поскольку он не является потокобезопасным.volatile vs threadLocal в java
я мог позволить каждому потоку иметь свою собственную копию SimpleDateFormat используя ThreadLocal так:
private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
Но летучие гарантии ключевых слов, что поток будет иметь самую свежую копию переменной. Так я мог бы не делать этого вместо этого:
volatile SimpleDateFormat myformatter;
и добиться той же безопасности потоков?
Поскольку проблема безопасности потоков не возникает: проблема безопасности потока заключается в том, что 'SimpleDateFormat' имеет изменяемое состояние, которое не зависит от того, хранится ли эта ссылка в поле volatile. –
Thread-local и 'volatile' не делают то же самое! С thread-local существует отдельная копия переменной для каждого потока. С 'volatile', все потоки разделяют одну переменную. Создание переменной 'volatile' не делает ее потокобезопасной, потому что' SimpleDateFormat' имеет внутреннее состояние, которое не должно обновляться несколькими потоками одновременно, как упоминал Энди. – Jesper