【发布时间】:2012-05-05 23:00:48
【问题描述】:
Exception in thread "Thread-8" java.lang.StackOverflowError
at sun.misc.Unsafe.compareAndSwapLong(Native Method)
at java.util.concurrent.atomic.AtomicLong.compareAndSet(Unknown Source)
at java.util.Random.next(Unknown Source)
at java.util.Random.nextInt(Unknown Source)
at sim.ant.colony.ants.Forager.moveTo(Forager.java:108)
我正在使用一个多线程应用程序(Ant Simulation Colony),我将每个蚂蚁创建为一个线程,并且当数十个线程(蚂蚁)正在运行时,每隔几圈就会发生上述异常并且线程被杀死。我使用 Random() 的代码是;
Random rand = new Random();
return adjacents.elementAt(rand.nextInt(8));
这段代码写在线程的本地成员函数中。所以假设每个线程创建数百次随机数并且有十多个线程在工作。
有人可以帮我解决这个例外吗?
【问题讨论】:
-
您应该考虑发布更多代码和更多堆栈跟踪,因为 stacoverflow 是一个递归,它只是太深并且堆栈被填满。因此,堆栈跟踪的开头几乎不能说明问题。
-
对象“rand”是否在线程之间共享?
-
"rand" 未共享。每个线程都创建它以供使用。我认为我正在使用的数组的索引范围有问题,因为我无法再次生成上述场景,但遇到了一些新的场景。 stacktraces 是一个不错的选择,我现在正在这样做......
-
这似乎发生在 Random ... 您可以使用 Math.random 代替 java.util.Random (我假设您目前使用)并检查您遇到的错误是否再次出现?
-
@Everyone Math.random() 在幕后也使用 java.util.Random。对于他遇到的问题,请阅读下面我的回答,它可能会帮助您了解发生了什么以及为什么您不应该浪费时间调查 java.util.Random
标签: java multithreading random synchronization thread-safety