两个HashMap对象覆盖彼此的值

时间:2017-03-23 10:35:13

标签: java session tomcat hashmap

我知道标题听起来极不可能,但我似乎无法找到任何其他解释我的问题。以下是详细信息:

Tomcat 7,Java 7. Tomcat运行一些webapps,它们都基于相同的模板:从session参数获取JSON字符串;将它交给一个自定义jar(放在Tomcat / lib文件夹中),它将解析它并将键和值存储在HashMap中;将自定义对象存储为会话参数。此模板部分在每个webapp中都相同。 webapp的实际逻​​辑可以从会话参数中获取自定义对象,并从HashMap中获取值。

当两个会话同时执行相同的webapp时,会出现问题。在这种情况下,首先初始化自定义对象的会话将通过第二个会话中的值覆盖其值。一个例子:

会话1启动webapp,参数中的JSON字符串为{“IN.VDN”:“86552”} 会话2启动webapp,参数中的JSON字符串为{“IN.VDN”:“86113”} 会话2初始化自定义解析器 会话1初始化自定义解析器 会话2查询VDN,接收86113 会话1查询VDN,接收86113(而不是86552)

自定义解析器不是Singleton,它始终是启动的(新的ServiceParamContainer();)。内部的HashMap不是静态的:

public class ServiceParamContainer {

    private HashMap<String, ServiceParamElement> params;

它也总是在构造函数中初始化:

params = new HashMap<String, ServiceParamElement>();

会话本身不会出错,因为JSON字符串不会更改,即使在自定义对象返回错误值后它也包含相同的值。自定义对象似乎也很好,因为通常它工作正常,只有在多个会话中同时执行相同的webapp时才会中断。此外,我在单独的会话中记录了toString()返回的值,它是不同的,这让我相信对象本身是不一样的。我不确定底层的HashMap。在单独的会话中使用相同的对象,或者它们被写入相同的存储区域,我不确定。我发现它很可疑,因为在这种情况下HashMaps包含完全相同的键,所以我猜Java在这里进行了优化。

你知道这里发生了什么吗?

0 个答案:

没有答案