我的代码生病了;看起来像是一个相当简单的对象写入和读取操作,似乎永远不会触发它的二次操作。远程对等体上的内部类线程通过OOS发送ConcurrentHashMap
。
当它到达时 - 确实如此 - 接收代码在布尔确定的循环中继续监听OIS以获取该CCHM的更新。这些更新来自发送原始CCHM的兄弟姐妹(每个接收对等体有一个服务兄弟)。这些兄弟姐妹使用的ObjectOutputStreams
取自兄弟姐妹的可见HashMap
。兄弟姐妹不关心他们是发送给该组的新成员还是现有成员。关于对等体是新的还是现有的差异仅在接收对等端已知,其中接收并使用原始CCHM,然后代码继续等待相同OIS上的更新。加入的新对等体将其详细信息添加到远程的Hashtable
,因此每次发送到所有对等体(新的对等体,加上现有的n)时,要发送的CCHM是一个更大的元素。
但是现有的同伴没有收到更新的CCHM。我没有用System.out.println()
电话来填充我的代码或者粗暴地停止它,而是我可能忽略了陷入困境的陷阱?
答案 0 :(得分:1)
请参阅ObjectOutputStream.reset()
...
重置将忽略已写入流的任何对象的状态。状态重置为与新的ObjectOutputStream相同。流中的当前点标记为重置,因此相应的ObjectInputStream将在同一点重置。先前写入流的对象将不会被称为流中的对象。它们将再次写入流中。