Является ли свойство val потокобезопасным? - PullRequest
0 голосов
/ 26 апреля 2018

Я могу использовать код A для изменения значения val a.

На мой взгляд, свойство val является поточно-ориентированным, но кажется, что оно не является поточно-безопасным в коде A, это похоже на varсвойство, любой поток может изменить переменную aImpl, другой поток может получить другое значение val a

Код A

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

fun seta(){
    aImpl=5
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы не можете провести четкое различие между 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свойство, имеющее открытый или пользовательский метод получения

. Интеллектуальное приведение не разрешено, в том числе из-за возможной мутации другого потока в результате пользовательского вызова get().

Следовательно:

  1. Простой val является поточно-ориентированным;
  2. A val с пользовательским или открытым геттером (не обязательно) не является поточно-ориентированным.
0 голосов
/ 26 апреля 2018

Конечно нет.Он будет работать как динамический геттер для aImpl, а не как свойство.

И aImpl не @Volatile, поэтому нет никаких гарантий безопасности потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...