所以我写了一个单元测试来测试一些多线程,并且我想知道这个代码是否能够保证按照我的预期工作。Kotlin局部变量线程安全
fun testNumbers() {
var firstNumber: Int? = null
var secondNumber: Int? = null
val startLatch = CountDownLatch(2)
val exec = Executors.newFixedThreadPool(2)
exec.submit({
startLatch.countDown()
startLatch.await()
firstNumber = StuffDoer.makeNumber()
})
exec.submit({
startLatch.countDown()
startLatch.await()
secondNumber = StuffDoer().makeNumber()
})
while (firstNumber == null || secondNumber == null) {
Thread.sleep(1)
}
}
具体来说,这种方法是否保证完成? firstNumber
和secondNumber
不是volatile
那么这意味着线程运行测试的线程可能永远不会看到从exec
线程的值中设置的结果?您不能将volatile应用于局部变量,所以实际上,如果可能有必要,您不能使函数局部变量变得不稳定。
(我加了Java作为一种标记,因为大概的基本问题是Java中的相同。)