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