【问题标题】:Why is this code thread safe? I thought the variable testValue is updated by different threads?为什么这个代码线程是安全的?我认为变量 testValue 是由不同的线程更新的?
【发布时间】:2019-07-23 21:07:11
【问题描述】:

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

【问题讨论】:

  • 如果你有两个线程和一个TestClassB 实例在它们之间共享你会遇到麻烦。
  • A) 第一个 sn-p 不是 Java B) 您的代码没有显示任何线程。 C)您的第一个示例使用 Kotlin @Synchronized 注释 D)您如何确定线程安全性以及如何确定这是一种正确的方法?
  • 对不起,这行下面应该有一个testThread.start():val testThread = Thread(this::testRun) in TestClassB。
  • Java 与 for (i in 0..2)fun testRun()? val?我错过了一些更新吗?
  • 你怎么知道它是线程安全的?如果不是,则没有输出可显示。 --- 您正在创建 3 个不同的 TestClassB 对象,因此没有一个对象被多个线程访问。

标签: java multithreading thread-safety


【解决方案1】:

测试不能证明某些东西是线程安全的。它只能证明你很幸运,而且它碰巧奏效了。线程安全问题只在某些时候出现——一般来说,您应该假设只有当您不查看线程安全代码并且只有当它可能产生最坏的影响时才会失败。 /p>

这些都不是线程安全的。

【讨论】:

  • 首先是线程安全的,因为3个线程访问3个不同的对象是没有问题的。现在,如果val testClassB = TestClassB() 在循环之外,情况就会不同。 --- 第二个代码不是线程安全的原因是因为它是一个单一的静态方法,即使使用 3 个不同的实例对象调用 (众所周知的语言缺陷)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 2018-04-12
  • 2015-07-24
  • 2017-06-16
  • 1970-01-01
相关资源
最近更新 更多