我认为以下代码不是线程安全的,因为变量testNum由多个线程更新。但我测试了一下,发现它是线程安全的。有人可以解释一下这段代码和 2 下的 java 代码之间的区别吗?
第一个代码,线程安全:
class TestClassA() {
@Synchronized
fun testMethodA() {
for (i in 0..2) {
val testClassB = TestClassB()
testClassB.testMethodB()
}
}
}
class TestClassB() {
private var testNum = 0
fun testMethodB() {
val testThread = Thread(this::testRun)
testThread.start()
}
fun testRun() {
testNum++
}
}
第二个代码,不是线程安全的:
class MyCounter {
private static int counter = 0;
public static int getCount() {
return counter++;
}
}
测试无法证明某些内容是线程安全的。 它只能证明你很幸运,它碰巧有效。 线程安全问题只是偶尔出现 - 一般来说,你应该假设线程不安全的代码只有在你不看它的时候才会失败,只有当它会产生最坏的影响时才会失败。
这些都不是线程安全的。