Код: Выделить всё
class MyApi {
private val singleThreadExecutor = Executors.newSingleThreadExecutor()
private var myApiState: State? = null
fun start() = singleThreadExecutor.submit {
myApiState = State.Default
doStartThings()
}
fun stop() = singleThreadExecutor.submit {
myApiState = null
doOtherStopThings()
}
}
Код: Выделить всё
Executors.newSingleThreadExecutor()Код: Выделить всё
nullТеперь в документации newSingleThreadExecutor() указано, что Однако обратите внимание, что если этот одиночный поток завершится из-за сбоя во время выполнения перед завершением работы, будет выполнен новый его место, если необходимо выполнить последующие задачи.. Допустим, у нас есть Thread#1 из newSingleThreadExecutor, который успешно выполнил блок start и выполнил stop, но неожиданно завершился. Затем у нас есть последующие вызовы start и stop, которые теперь выполняются из Thread#2, созданного newSingleThreadExecutor. Таким образом, возможно, что два разных потока будут читать и записывать myApiState, хотя одновременно это будет делать только один.
Вопрос в том, все ли записи выполняются Thread#1 для myApiState гарантированно будет видимым для Thread#2 (и если да, то почему), или необходима дополнительная синхронизация (т. е. сделайте myApiState< /код> летучих)?
Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/793 ... adexecutor
Мобильная версия