我可以使用代码A来更改val a的值。
在我看来,val属性是线程安全的,但似乎它在代码A中不是线程安全的,
它就像var属性一样,任何线程都可以更改变量aImpl,不同的线程可能会得到val a
的不同值
代码A
var aImpl = 0
val a: Int get() = aImpl
fun seta(){
aImpl=5
}
答案 0 :(得分:2)
您无法明确区分具有和不具有自定义getter的val
。如果你将这两者混为一谈,就像你的问题一样,那么val
就不是线程安全的;然而,Kotlin确实做出了这种区分,你可以在这个例子中观察到:
val simpleVal: Int? = 3
val customVal: Int? get() = simpleVal
fun main(args: Array<String>) {
if (simpleVal != null) {
println(simpleVal + 1)
}
if (customVal != null) {
println(customVal + 1) // ERROR!
}
}
错误:(12,21)Kotlin:智能转换为'Int'是不可能的,因为'customVal'是一个具有开放或自定义getter的属性
除其他原因外,由于另一个线程可能会改变自定义get()
调用的结果,因此不允许使用智能广播。
因此:
val
是线程安全的; val
不一定是线程安全的。答案 1 :(得分:1)
当然不是。它将作为aImpl
的动态getter,而不是属性。
且aImpl
不是@Volatile
,因此不保证线程安全。