为什么此代码线程是安全的?我认为变量 testValue 是由不同的线程更新的



我认为以下代码不是线程安全的,因为变量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++;
    }
}

测试无法证明某些内容是线程安全的。 它只能证明你很幸运,它碰巧有效。 线程安全问题只是偶尔出现 - 一般来说,你应该假设线程不安全的代码只有在你不看它的时候才会失败,只有当它会产生最坏的影响时才会失败。

这些都不是线程安全的。

最新更新