gpt4 book ai didi

java - 从子类访问时的最终字段状态

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:31 25 4
gpt4 key购买 nike

我看到一个奇怪的行为,根据 JMM,这似乎不应该发生。我有 B 类,它扩展了 A 类,A 中的最终 protected 字段在 A 构造函数中初始化,B 类在其构造函数中访问。

但是,在极少数情况下,我在 B 中访问时会得到 NPE。有什么想法吗?

部分代码:

class AsyncReplicationSourceGroup extends AbstractReplicationSourceGroup{

public AsyncReplicationSourceGroup(DynamicSourceGroupConfigHolder groupConfig){
super(groupConfig);
createReplicationChannels();
}

protected void createReplicationChannels(){
//...
specificLogger.finest("created channel"); // this is where the NPE is thrown from
//...
}
}

abstract class AbstractReplicationSourceGroup{

protected final Logger specificLogger;

public AbstractReplicationSourceGroup(DynamicSourceGroupConfigHolder groupConfigHolder){
specificLogger = Logger.getLogger(Constants.LOGGER_REPLICATION_GROUP + "." + _groupConfigHolder.getConfig().getName());
//...
}

}

最佳答案

从单独发布的代码中无法确定,但如果您确定记录器本身为空(并且您没有从内部错误地看到 NPE,比如 specificLogger.finest),那么最有可能的是解释是 Logger.getLogger 出于某种原因偶尔会返回 null。

我不认为问题出在线程上,因为一旦构造对象可见,只要构造函数内部没有引用泄漏,分配给构造函数的最终字段就保证可见。

关于java - 从子类访问时的最终字段状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11084347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com