异常 – 在并发程序中使用不可变映射的Scala错误?
发布时间:2020-12-16 18:32:13 所属栏目:安全 来源:网络整理
导读:我为棋盘游戏Nine Men’s Morris写了一个蒙特卡洛球员.一切都基本不变.该程序涉及许多未来(数百)和许多修改不可变的地图.有时我遇到以下异常的崩溃: java.lang.NullPointerException at scala.collection.mutable.HashTable$class.elemHashCode(HashTable.s
我为棋盘游戏Nine Men’s Morris写了一个蒙特卡洛球员.一切都基本不变.该程序涉及许多未来(数百)和许多修改不可变的地图.有时我遇到以下异常的崩溃:
java.lang.NullPointerException at scala.collection.mutable.HashTable$class.elemHashCode(HashTable.scala:154) at scala.collection.immutable.HashMap.elemHashCode(HashMap.scala:41) at scala.collection.mutable.HashTable$class.findEntry(HashTable.scala:66) at scala.collection.immutable.HashMap.findEntry(HashMap.scala:41) at scala.collection.immutable.HashMap.undo$1(HashMap.scala:132) at scala.collection.immutable.HashMap.undo$1(HashMap.scala:130) at scala.collection.immutable.HashMap.makeCopy(HashMap.scala:154) at scala.collection.immutable.HashMap.makeCopyIfUpdated(HashMap.scala:161) at scala.collection.immutable.HashMap.update(HashMap.scala:66) at scala.collection.immutable.Map$class.$plus(Map.scala:66) at scala.collection.immutable.HashMap.$plus(HashMap.scala:41) at morris.players.MapBasedMorrisBoard.applyMove(MapBasedMorrisBoard.scala:30) at morris.players.MonteCarloPlayer$$anonfun$main$1$$anonfun$apply$1.apply(MonteCarloPlayer.scala:77) at morris.players.MonteCarloPlayer$$anonfun$main$1$$anonfun$apply$1.apply(MonteCarloPlayer.scala:77) at scala.actors.Futures$$anonfun$2$$anonfun$apply$1.apply(Future.scala:45) at scala.actors.Futures$$anonfun$2$$anonfun$apply$1.apply(Future.scala:44) at scala.actors.Reaction.run(Reaction.scala:78) at scala.actors.FJTask$Wrap.run(Unknown Source) at scala.actors.FJTaskRunner.scanWhileIdling(Unknown Source) at scala.actors.FJTaskRunner.run(Unknown Source) 我只使用不可变映射,所以我想知道这是由我自己的代码中的错误还是scala库中的错误引起的.在查看您可以看到的跟踪时,可以在堆栈中进一步调用可变HashTable.也许这会引起并发问题? 我的程序中的代码,发生异常只是将另一个集合添加到不可变的Map: myMap ++ (someInteger -> aValue) 编辑: 解决方法
我已经为Scala库提交了一份错误报告.事实证明这是一个已知问题. HashMap(在Scala中用作标准Map类型)的实现不适合在并发程序中使用,因为它在幕后使用可变类型.这也可以在堆栈跟踪中观察到. Scala人希望能够取代2.8中的实现.
作为解决方法,建议使用TreeHashMap,它是真正不可变的.我做到了这一点,并确认它有效. Link to original bug report (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |