美文网首页
Java8内置函数接口Supplier在ThreadLocal的

Java8内置函数接口Supplier在ThreadLocal的

作者: 码而优则仕 | 来源:发表于2020-08-28 13:40 被阅读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;
        }
    
    

    相关文章

      网友评论

          本文标题:Java8内置函数接口Supplier在ThreadLocal的

          本文链接:https://www.haomeiwen.com/subject/nlqlsktx.html