最终的非空字段变为空

final non-null field becomes null

这怎么可能?

public class WritableByteChannelEndpoint extends Endpoint<ByteBuffer> {

    private final WritableByteChannel channel;

    public WritableByteChannelEndpoint(WritableByteChannel channel, Observable<ByteBuffer> observable) {
        super(observable);
        this.channel = Objects.requireNonNull(channel);
    }

    // ...

    @Override
    public void onNext(ByteBuffer input) {
        assert channel != null;
        // ...
    }

}

我在该行中收到断言错误。出于某种原因,我无法理解,channel 为空。

当我使用 JUnit 执行单元测试时,偶尔会出现这种情况。

理论上是否可能,整个 WritableByteChannelEndpoint 实例已经被垃圾收集并且 channel 被设置为空,但其他一些对象仍然存在有(弱?)参考吗?

在通过弱引用怀疑奇怪的 GC 行为之前,请考虑更可能的竞争条件:您的构造函数在设置 this.channel 之前调用超类构造函数。因此,超类构造函数可以泄漏对应于正在构造的 thisWritableByteChannelEndpoint,导致在子类构造函数有机会设置 [=14= 的值之前调用 onNext ].您的最终字段不会 变为 空值,因为它没有机会及时(间歇性地)变为非空值。