val属性线程安全吗?

时间:2018-04-26 01:03:30

标签: kotlin

我可以使用代码A来更改val a的值。

在我看来,val属性是线程安全的,但似乎它在代码A中不是线程安全的, 它就像var属性一样,任何线程都可以更改变量aImpl,不同的线程可能会得到val a的不同值

代码A

var aImpl = 0
val a: Int get() = aImpl

fun seta(){
    aImpl=5
}

2 个答案:

答案 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()调用的结果,因此不允许使用智能广播。

因此:

  1. 简单的val是线程安全的;
  2. 带有自定义或开放式getter的val不一定是线程安全的。

答案 1 :(得分:1)

当然不是。它将作为aImpl的动态getter,而不是属性。

aImpl不是@Volatile,因此不保证线程安全。