2014-11-28 4 views
4

Например, у нас есть статический 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); 
} 

ответ

11

Это безопасно, потому что getMap возвращает карту для данного (т.е. текущей) нити. Ни одна другая нить не собирается возиться с этим. Так что дело доходит до реализации getMap, чтобы убедиться, что , это, подходит для любого потока - и, насколько я вижу, это просто делегирует поле в пределах объекта Thread. Мне непонятно, проходит ли getMap в любом потоке другой, чем текущая нить - если это было возможно, это может быть сложно, но я подозреваю, что все это было написано тщательно, чтобы убедиться, что это не проблема :)

+1

Я считаю, что использование ThreadLocal - плохая практика и выглядит как хак. – DontRelaX

+1

@DontRelaX: Я не вижу, как это относится к вопросу или к ответу. Я * несколько * согласен, хотя иногда может быть полезно некоторое понятие контекста, но я не вижу, как комментарий полезен в этом вопросе или ответе. –

+0

@Jon 'Так что это действительно до внедрения getMap, чтобы убедиться, что это нормально для любого потока' - спасибо, что освободили это для меня! – iozee