编程语言
首页 > 编程语言> > java – final非null字段变为null

java – final非null字段变为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;
        // ...
    }

}

我在那一行得到一个断言错误.出于某种原因,我无法理解,频道为空.

当我使用JUnit执行单元测试时,偶尔会发生这种情况.

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

解决方法:

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

标签:java,jls
来源: https://codeday.me/bug/20190628/1311085.html