gpt4 book ai didi

java - 如何从多个线程同时调用一个方法?

转载 作者:行者123 更新时间:2023-11-30 11:34:30 25 4
gpt4 key购买 nike

我有一个应用程序应该(在某些情况下)防止多线程。为了对此进行测试,我需要同时从多个线程调用一个方法。

class MyObject {

val myMethodCalled = new AtomicBoolean()

def myMethod() = {

if (myMethodCalled.getAndSet(true))
throw new IllegalStateException("Do not call myMethod twice")
}
}

我想从测试用例中触发上述方法中的异常。

这在 JVM 中可能吗?如果可以,怎么做?

编辑

我想知道是否有任何方法(使用一些技巧或我不知道的类)在虚拟机中同时调用一个方法。我想那是不可能的。

最佳答案

您应该通过在方法的中间 hibernate (Thread.sleep) 或进行耗时的繁忙工作来减慢方法的处理速度,然后让两个或更多其他线程调用该方法作为尽可能快。

您还可以抽象出只运行一次的功能,以便单独测试它。例如

def onlyOnce[A](f: => A) = {
if (myMethodCalled.getAndSet(true)) throw new Exception("Twice!")
f
}

然后当您需要测试这是否真的有效时,您可以传入一个缓慢执行的 f 以使测试变得容易。否则,在你的一次性方法中你

def doSomething = onlyOnce {
}

如果你正确地测试了 onlyOnce 就不会出错(假设事情被正确封装以便 f 的主体不会弄乱 myMethodCalled).

最后,您最好的选择是使用一台至少具有三个实际执行线程的机器,并让其中两个执行 busywaiting,其中一个翻转另一个正在读取的 volatile var,然后都运行该方法。这本身并不可靠,但如果您在两者之间有较小的忙等待偏移量并且多次覆盖相关空间,您至少可以做出统计论证,证明您至少几乎一直都没有问题。

关于java - 如何从多个线程同时调用一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15625943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com