【问题标题】:implementing a lazy Supplier in java在java中实现一个惰性供应商
【发布时间】:2012-12-01 20:54:14
【问题描述】:

在 Java 中实现惰性供应商的正确范例或实用程序类(似乎找不到预先存在的类)是什么?

我想要一些东西来处理计算一次/缓存后的行为,并允许我独立指定计算行为。我知道这可能有一个错误,但它具有正确的语义:

abstract public class LazySupplier<T> implements Supplier<T> 
{
    private volatile T t;
    final private Object lock = new Object();

    final public T get() {
        if (t == null)
        {
            synchronized(lock)
            {
                if (t == null)
                    t = compute();
            }
        }
        return t;
    }
    abstract protected T compute();
}

【问题讨论】:

  • 这对我来说很好,你在烦恼什么?
  • 我知道并发不是你搞砸的东西,除非你真的采取了正确的步骤来确保它是正确的。
  • 此处显示的示例代码是双重 ckecked 锁定,如cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html 中所述,是一种不好的做法
  • @CarloPellegrini:在 volatile 字段之前情况很糟糕。现在没问题,只要你正确实现(使用volatile)。
  • @ColinD 注意。在 JDK 5 和新的内存模型 (JSR 133) 之前它很糟糕。不幸的是,在工作中我被 JDK 1.4 困住了。太糟糕了...

标签: java guava lazy-evaluation


【解决方案1】:

这已经在Suppliers.memoize 方法中实现了。

public static <T> Supplier<T> memoize(Supplier<T> delegate)

返回一个供应商,该供应商缓存在 第一次调用 get() 并在后续调用时返回该值 得到()。请参阅:记忆化

返回的供应商是线程安全的。委托的 get() 方法将 最多调用一次。供应商的序列化表格不 包含缓存的值,将在 get() 时重新计算 在重新序列化的实例上调用。

如果委托是由先前调用 memoize 创建的实例,它 直接返回。

【讨论】:

    【解决方案2】:

    Apache Commons Lang 有一个LazyInitializer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 2010-10-22
      • 2019-01-27
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多