最终的非空字段变为空
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
之前调用超类构造函数。因此,超类构造函数可以泄漏对应于正在构造的 this
的 WritableByteChannelEndpoint
,导致在子类构造函数有机会设置 [=14= 的值之前调用 onNext
].您的最终字段不会 变为 空值,因为它没有机会及时(间歇性地)变为非空值。
这怎么可能?
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
之前调用超类构造函数。因此,超类构造函数可以泄漏对应于正在构造的 this
的 WritableByteChannelEndpoint
,导致在子类构造函数有机会设置 [=14= 的值之前调用 onNext
].您的最终字段不会 变为 空值,因为它没有机会及时(间歇性地)变为非空值。