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

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

Сообщение Anonymous »

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

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

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

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

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

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

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

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

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