Java: final字段树图改变大小



我有一个java代码,它包含一个类TRADE_HISTORY,它保存着交易的历史。

TRADE_HISTORY类有一个名为fmapdateoutputpriceratio的最终字段,该字段在构造函数中设置。fmapdateoutputpriceratio是日期和双元数组(TreeMap)之间的映射。在构造函数中,使用

将字段赋值给实参。
fMapDateOutputPriceRatios = new TreeMap<Date, double[]>(aOutputPriceRatioData); 

使用

获取日期数
Set<Date> dates = fMapDateOutputPriceRatios.keySet();

日期的大小在构造函数中打印出来。该类只有一个构造函数。

添加新交易时出现问题。当添加新日期时,使用双向量,并从

获得
 double[] outputPriceRatios = fMapDateOutputPriceRatios.get( aDate );

由于日期不可用而发生错误。

当尝试调试错误时,正在打印日期的大小。

在构造时,大小为1973个元素。

错误发生时,大小为1964个元素。

特别是,2011年4月11日的日期在错误发生时是不可用的。

我正在使用eclipse,并在变量fmapdateoutputpriceratio上设置了一个断点,以便在字段被修改时中断。它只在构造函数期间中断。

关于如何确定fmapdateoutputpriceratio的大小变化的任何建议?

访问fMapDateOutputPriceRatios的唯一行是

TRADE_HISTORY::TRADE_HISTORY(Map<Date, double[]> aOutputPriceRatioData )
        fMapDateOutputPriceRatios = new TreeMap<Date, double[]>(aOutputPriceRatioData); 
        Set<Date> dates = fMapDateOutputPriceRatios.keySet();  // Used to debug error
TRADE_HISTORY::public void addTradeDistribution_0_to_100(Date aDate, ...)
        outputPriceRatios = fMapDateOutputPriceRatios.get( aDate )  // Causes error
        Set<Date> dates = fMapDateOutputPriceRatios.keySet();   // Used to debug error

对对象实例的最后引用不会使该实例不可变!它只阻止将引用更改为指向不同的对象实例。引用是final的,而不是它引用的对象实例的状态。

注意,keySet()返回的键集是由映射支持的。如果从中删除键,则从fMapDateOutputPriceRatios中删除相应的映射。你是在修改dates还是将其用于除调试之外的任何事情?

首先,重要的问题:您确定用作键的日期没有在任何地方被修改吗?Date应该是一个不可变对象,但它仍然包含旧的过时方法,允许更改键内容。这将对TreeMap造成不可预测的后果,包括您所描述的后果。

同时,确保所有日期的小时/分钟/秒/毫秒清除为0。

现在,假设日期是不可变的:

您实际上已经观察到键集大小的减小,这意味着发生了对内容的物理修改。我知道它是如何发生的唯一方法是两个或多个线程并发访问映射。

TreeMap必须在添加新键时重建树。也就是说,取消树的一部分链接,然后在树的其他地方重新链接它。在此期间,如果另一个线程访问相同的结构并执行相同的操作,则该子树可能会丢失,从而导致键数减少。

因此,作为第一步,尝试在同步块中访问该字段:

synchronized(fMapDateOutputPriceRatios) {
    outputPriceRatios = fMapDateOutputPriceRatios.get( aDate )
}

注:我实际上没有看到put()在你的代码的任何地方,但它必须在那里,没有奇迹

感谢您的反馈。

将日期/输出价格图移动到驱动函数中可以消除日期/输出价格图出现问题的可能性。但是,仍然会得到意想不到的错误。

在TRADE_HISTORY的构造函数中添加了一个静态计数器,以跟踪TRADE_HISTORY构造的数量。此外,一个整数id被添加到构造函数中,并设置为等于计数器,因此id应该是1,2,3 ....

当前错误发生时,打印TRADE_HISTORY id并为零,这是不应该发生的。在TRADE_HISTORY实例的构造函数中需要进行更多的调试。似乎有一个没有正确构造的TRADE_HISTORY正在被使用。

如果需要更多的帮助,将开始一个不同的问题

最新更新