Например, у нас есть статический ThreadLocal поля в сеттер:Безопасна ли ThreadLocal?
private static final ThreadLocal threadLocalField = new ThreadLocal;
public static void getSXTransaction() {
threadLocalField.set(new MyValue());
}
Интересно, а каковы гарантии безопасности потока здесь нет неявной синхронизации в java.lang.ThreadLocal # установить метод? Я знаю, что класс TreadLocal имеет смысл быть полностью потокобезопасным по своей природе, но я не могу понять, как это делается.
Вот исходный код для него:
/**
* Sets the current thread's copy of this thread-local variable
* to the specified value. Most subclasses will have no need to
* override this method, relying solely on the {@link #initialValue}
* method to set the values of thread-locals.
*
* @param value the value to be stored in the current thread's copy of
* this thread-local.
*/
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
Я считаю, что использование ThreadLocal - плохая практика и выглядит как хак. – DontRelaX
@DontRelaX: Я не вижу, как это относится к вопросу или к ответу. Я * несколько * согласен, хотя иногда может быть полезно некоторое понятие контекста, но я не вижу, как комментарий полезен в этом вопросе или ответе. –
@Jon 'Так что это действительно до внедрения getMap, чтобы убедиться, что это нормально для любого потока' - спасибо, что освободили это для меня! – iozee