Kotlin val属性线程是否安全?

Kotlin val属性线程是否安全?,kotlin,Kotlin,我可以使用代码A更改val A的值 在我看来,val属性是线程安全的,但在代码A中它似乎不是线程安全的, 这就像var属性一样,任何线程都可以更改变量aImpl,不同的线程可能会得到不同的val a 代码A var aImpl = 0 val a: Int get() = aImpl fun seta(){ aImpl=5 } 当然不是。它将作为aImpl的动态getter,而不是属性 而且aImpl不是@Volatile,因此没有任何线程安全保证。当然不是。它将作为aImpl的动态

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

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

代码A

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

fun seta(){
    aImpl=5
}

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


而且
aImpl
不是
@Volatile
,因此没有任何线程安全保证。

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


而且
aImpl
不是
@Volatile
,因此没有任何线程安全保证。

您无法明确区分带有和不带自定义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!
    }
}
val simpleVal:Int?=3.
瓦尔:Int?get()=simpleVal
趣味主线(args:Array){
if(simpleVal!=null){
println(simpleVal+1)
}
如果(customVal!=null){
println(customVal+1)//错误!
}
}
错误:(12,21)Kotlin:不可能对“Int”进行智能转换,因为“customVal”是一个具有open或custom getter的属性

除其他原因外,由于另一个线程可能会改变自定义
get()
调用的结果,因此不允许智能强制转换

因此:

  • 简单的
    val
    是线程安全的
  • 带有自定义或打开getter的
    val
    (不一定)是线程安全的

  • 您无法明确区分带有和不带有自定义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!
        }
    }
    
    val simpleVal:Int?=3.
    瓦尔:Int?get()=simpleVal
    趣味主线(args:Array){
    if(simpleVal!=null){
    println(simpleVal+1)
    }
    如果(customVal!=null){
    println(customVal+1)//错误!
    }
    }
    
    错误:(12,21)Kotlin:不可能对“Int”进行智能转换,因为“customVal”是一个具有open或custom getter的属性

    除其他原因外,由于另一个线程可能会改变自定义
    get()
    调用的结果,因此不允许智能强制转换

    因此:

  • 简单的
    val
    是线程安全的
  • 带有自定义或打开getter的
    val
    (不一定)是线程安全的

  • @s1m0nw1在这个concreate示例中,它可能是。无缓存→ 没有不可预测的效果。@s1m0nw1在这个concreate示例中可能是。无缓存→ 没有不可预测的影响。