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