Kotlin val属性线程是否安全?
我可以使用代码A更改val A的值 在我看来,val属性是线程安全的,但在代码A中它似乎不是线程安全的, 这就像var属性一样,任何线程都可以更改变量aImpl,不同的线程可能会得到不同的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的动态
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
是线程安全的李>
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
是线程安全的李>
val
(不一定)是线程安全的@s1m0nw1在这个concreate示例中,它可能是。无缓存→ 没有不可预测的效果。@s1m0nw1在这个concreate示例中可能是。无缓存→ 没有不可预测的影响。