用空值初始化WeakReference可以吗?

时间:2018-10-10 09:24:20

标签: c# weak-references

我有一个仅一次只能有一个实例的类。本质上,这是一个单例,当不保留任何外部引用时,该单例将被销毁;在以后需要新引用时,将其重新实例化。

private static readonly WeakReference<Foo> weakInstance = new WeakReference<Foo>(null);

使用上述代码的原因是因为我有本地iOS回调(必须是静态函数),但需要将数据传递给当前实例。

tl; dr WeakReference初始化为null并稍后设置目标是否安全?这是代码气味吗?

编辑: 正如@smolchanovsky指出的那样,我可以在需要设置时实例化弱引用。结果是:

if (weakInstance == null)
{
    weakInstance = new WeakReference<Foo>(this);
}
else
{
    weakInstance.SetTarget(this);
}

// Overwrite the existing WeakReference object
weakInstance = new WeakReference<Foo>(this);

有理由选择其中一个吗?

1 个答案:

答案 0 :(得分:2)

为什么不使用它?

StepVerifier.withVirtualTime(() -> {
            Mono<String> monoFromSupplier = Mono.fromSupplier(() -> "AA")
                    .doOnNext(po -> {
                        System.out.println("monoFromSupplier:onNext " + Thread.currentThread().getName());
                    });

            Mono<String> monoFromWebClient = WebClient.create("http://...")
                    .get()
                    .retrieve()
                    .bodyToMono(String.class)
                    .doOnNext(po -> {
                        System.out.println("monoFromWebClient:onNext " + Thread.currentThread().getName());
                    });


            Mono<?> selectedMono = monoFromSupplier; 
            return selectedMono.repeatWhen(companion -> companion.take(3)
                    .delayUntil(r -> {
                        Duration dur = Duration.ofSeconds(500);
                        System.out.println("delay... " + dur);
                        return Mono.delay(dur);
                    }))
                    .last()
                    .log();

        })
                .thenAwait(Duration.ofDays(1))
                .expectNextCount(1)
                .expectComplete()
                .verify();

请注意,这不是线程安全的解决方案。