首先看下它的數據結構java
ThreadLocal.ThreadLocalMap 是thread 的一個成員變量,它的生命週期和thread是相同的數據結構
咱們不妨看下咱們最經常使用的ThreadLocal#get方法ide
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); }
重點看下setInitialValue方法,做用就是給thread的ThreadLocalMap賦值,ThreadLocalMap存在就用原來的,不然就建立一個新的並給thread的threadLocals成員變量this
private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; } void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); }
因此通常咱們會這麼使用ThreadLocalcode
import java.text.ParseException; import java.util.Date; import java.text.SimpleDateFormat; public class DateUtil { private static ThreadLocal<SimpleDateFormat> local=new ThreadLocal<SimpleDateFormat>(){ @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } }; public static Date parse(String str){ try { return local.get().parse(str); } catch (ParseException e) { e.printStackTrace(); }finally { local.remove(); } return null; } }