我正在尝试解决间歇性故障,该故障似乎与从HashMap中删除对象然后使用新密钥放回同一对象有关.我的HashMap创建如下:
transactions = new HashMap();
执行重新分配的代码如下:
transactions.remove(transaction.tran_no); transaction.tran_no = generate_transaction_id(); transactions.put(transaction.tran_no, transaction);
我看到的间歇性行为是,在此之后立即执行的代码依赖于可定位的事务对象,似乎不会使用新的事务id找到事务对象.但是,在将来的某个时刻,可以找到交易.所以拉扯秸秆,put()或删除会产生这种行为的异步效果吗?
我应该提一下,据我所知,容器只能由一个线程访问.我已经在文档中读到类HashMap没有"同步".
删除/获取和放置之间略有不同(尽管我的猜测是你有线程问题).
remove
/ 的参数get
类型Object
; 因为put
它是类型K
.其原因之前已多次说明.这意味着它有拳击问题.我甚至不会猜测规则是什么.如果一个值被装箱Byte
在一个地方而一个Short
在另一个地方,那么这两个对象就不能相等.
与List.remove(int)
和有一个类似的问题List.remove(Object)
.
我相信,每一次你检查你肯定使用该项目的存在short
或Short argument
对Map.get()
或Map.contains()
?
这些方法采用Object参数,因此如果您传递它们int
,它将被转换为a Integer
并且永远不会匹配Map中的任何项目,因为它们都将具有Short
键.