单例模式一般有两种实现方式: 静态内部类 和 DCL+volatile
reactor的Schedulers另辟新境,使用AtomicReference变相实现单例模式。
public static Scheduler elastic() {
return cache(CACHED_ELASTIC, ELASTIC, ELASTIC_SUPPLIER);
}
static AtomicReference<CachedScheduler> CACHED_ELASTIC = new AtomicReference<>();
static final String ELASTIC = "elastic"; // IO stuff
static final Supplier<Scheduler> ELASTIC_SUPPLIER =
() -> newElastic(ELASTIC, ElasticScheduler.DEFAULT_TTL_SECONDS, true);
static CachedScheduler cache(AtomicReference<CachedScheduler> reference, String key, Supplier<Scheduler> supplier) {
CachedScheduler s = reference.get();
if (s != null) {
return s;
}
//并发情况下有可能new出多个CachedScheduler(当然这种概率很低)
s = new CachedScheduler(key, supplier.get());
//这里保证了仅有一个set到reference里
if (reference.compareAndSet(null, s)) {
return s;
}
//多余new出来的直接销毁
s._dispose();
//返回reference里的
return reference.get();
}
严格意义上,可能new多个对象,不算单例。这里仅仅提供一种设计思路