Java8内置函数接口Supplier在ThreadLocal的

2020-08-28  本文已影响0人  码而优则仕

最近研究 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;
    }

上一篇 下一篇

猜你喜欢

热点阅读