Ограничение потока Java с помощью Executors.newSingleThreadExecutor()JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Ограничение потока Java с помощью Executors.newSingleThreadExecutor()

Сообщение Anonymous »

Вопрос в видимости памяти. У меня есть некоторые сомнения относительно того, будет ли такая программа, как следующая, потокобезопасной:

Код: Выделить всё

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()
гарантирует, что с myApiState одновременно будет взаимодействовать только один поток. Инициализация myApiState значением по умолчанию () происходит в другом потоке, но я понимаю, что это нормально, потому что Инициализация любого объекта по умолчанию происходит перед любыми другими действиями программы (кроме записи по умолчанию).
Теперь в документации newSingleThreadExecutor() указано, что Однако обратите внимание, что если этот одиночный поток завершится из-за сбоя во время выполнения перед завершением работы, будет выполнен новый его место, если необходимо выполнить последующие задачи.. Допустим, у нас есть Thread#1 из newSingleThreadExecutor, который успешно выполнил блок start и выполнил stop, но неожиданно завершился. Затем у нас есть последующие вызовы start и stop, которые теперь выполняются из Thread#2, созданного newSingleThreadExecutor. Таким образом, возможно, что два разных потока будут читать и записывать myApiState, хотя одновременно это будет делать только один.
Вопрос в том, все ли записи выполняются Thread#1 для myApiState гарантированно будет видимым для Thread#2 (и если да, то почему), или необходима дополнительная синхронизация (т. е. сделайте myApiState< /код> летучих)?
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/793 ... adexecutor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»