最近研究 ThreadLocal源码的时候,发现 ThreadLocal中使用了函数式接口Supplier,可以供我们学习,借鉴,所以在这里分享一下。
Supplier 接口:
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
ThreadLocal中定义了一个内部类,内部类中把这个函数接口定义为一个属性,在构造函数中传入该函数接口。并提供一个方法触发 函数接口调用,返回结果。
static final class SuppliedThreadLocal<T> extends ThreadLocal<T> {
//函数接口
private final Supplier<? extends T> supplier;
//在构造函数中赋值该函数接口
SuppliedThreadLocal(Supplier<? extends T> supplier) {
this.supplier = Objects.requireNonNull(supplier);
}
//开接口,触发函数接口实现调用
@Override
protected T initialValue() {
return supplier.get();
}
}
在ThreadLocal类中定义一个 静态方法,调用内部类构造函数,传入函数接口实现
public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier) {
return new SuppliedThreadLocal<>(supplier);
}
ThreadLocal 的 get方法触发 该有结果返回的函数接口实现类执行。
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;
}
}
//调用 ThreadLocal 的私有方法 setInitialValue 触发
return setInitialValue();
}
private T setInitialValue() {
//调用内部类中的 initialValue 方法 触发 函数接口实现执行
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
网友评论