【发布时间】: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