2014-03-06 21 views
0

我試圖插入元素,以一個可變的地圖和我試過了,我得到了例外如下:插接件的斯卡拉可變地圖拋出錯誤

java.lang.ArrayIndexOutOfBoundsException: 62388 
at scala.collection.mutable.HashTable$class.resize(HashTable.scala:255) 
at scala.collection.mutable.HashTable$class.scala$collection$mutable$HashTable$$addEntry0(HashTable.scala:151) 
at scala.collection.mutable.HashTable$class.findOrAddEntry(HashTable.scala:163) 
at scala.collection.mutable.HashMap.findOrAddEntry(HashMap.scala:39) 
at scala.collection.mutable.HashMap.$plus$eq(HashMap.scala:89) 
at scala.collection.mutable.HashMap.$plus$eq(HashMap.scala:39) 
at test.testMethod(AkkaLoadTest.scala:165) 
at test.testMethod(AkkaLoadTest.scala:27) 
at rait$PriceRequestWorker$$anonfun$receive$2.applyOrElse(AkkaLoadTest.scala:224) 
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:425) 
at akka.actor.ActorCell.invoke(ActorCell.scala:386) 
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:230) 
at akka.dispatch.Mailbox.run(Mailbox.scala:212) 
at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:502) 
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 

它通過看起來很奇怪!這是我做的:

var mutableMap= scala.collection.mutable.Map[String, List[String]]() 

我全局聲明地圖在我的對象,在我的TestMethod的,我做到以下幾點:

if(anotherList.size > 0) { 
    mutableMap.get(id) match { 
    case Some(entries) => /* Do nothing as the entry is already available in the map */ 
    case None => { 
     mutableMap+= id-> anotherList 
    } 
    } 
} 

的ID作爲另一個參數傳遞給上述方法代碼被執行。我很困惑,看到在我看來沒有任何意義的例外!有任何想法嗎?

回答

5

可變集合不是線程安全的。您是否有機會從不同的線程同時訪問或更新它?鑑於你說你的地圖是「全球」,而你使用阿卡演員,這看起來像是一場災難。你不應該在不同的演員之間分享狀態。

你可能會試圖迫使如果故障消失通過

import scala.collection.mutable 
val mutableMap = new mutable.HashMap[String, List[String]] 
    with mutable.SynchronizedMap[String, List[String]]() 

同步地圖,你知道,線程是問題。然後你會重新考慮你的狀態模型;如果你真的想要一個共享的地圖和性能SynchronizedMap是太糟糕了,你可以嘗試替代品,如scala.collection.concurrent.Map

+0

是的,我用的演員。我知道這個異常是由於共享狀態造成的。但是我也有一個全局的ListBuffer,它的行爲以線程安全的方式進行,我總是得到在全局ListBuffer中填充的適當的元素集合。這是爲什麼? – sparkr

+5

@ user3102968你很幸運,這就是爲什麼。 – wheaties