package org.osgl.concurrent; /** * Implement {@link org.osgl.concurrent.ContextLocal} using * JDK ThreadLocal */ public class JDKThreadLocal<T> extends ContextLocalBase<T> implements ContextLocal<T> { private volatile ThreadLocal<T> tl; public JDKThreadLocal() {} public JDKThreadLocal(InitialValueProvider<T> ivp) { super(ivp); } private ThreadLocal<T> tl() { if (null == tl) { synchronized (this) { if (null == tl) { final JDKThreadLocal<T> me = this; tl = new ThreadLocal<T>() { @Override protected T initialValue() { return me.initialValue(); } }; } } } return tl; } @Override public T get() { return tl().get(); } @Override public void set(T value) { tl().set(value); } @Override public void remove() { tl().remove(); } }