Отсутствие поточной безопасности означает, что если несколько потоков пытаются получить доступ к объекту одновременно, что-то может измениться от одного доступа к другому и вызвать проблемы.Примите во внимание следующее:
int incrementCount() {
this.count++;
// ... Do some other stuff
return this.count;
}
не будет потокобезопасным.Почему это не так?Представьте, что поток 1 обращается к нему, count
увеличивается, затем происходит некоторая обработка.Проходя через функцию, другой поток обращается к ней, снова увеличивая count
.Первый поток, в котором он прошел, скажем, от 1 до 2, теперь будет иметь значение от 1 до 3, когда вернется.Поток 2 будет видеть, что он будет также переходить с 1 на 3, так что же случилось с 2?
В этом случае вы захотите что-то вроде этого (помните, что это не какой-то языковой код,но ближе всего к Java, один из 2, в которые я потянул потоки)
int incrementCount() synchronized {
this.count++;
// ... Do some other stuff
return this.count;
}
Ключевое слово synchronized
здесь гарантирует, что до тех пор, пока один поток обращается к нему, другие потоки не смогут.Это будет означать, что поток 1 попадает в него, count
идет от 1 до 2, как и ожидалось.Поток 2 попадает в него, пока обрабатывается 1, он должен дождаться завершения потока 1.Когда это будет сделано, поток 1 получит возврат 2, затем поток 2 перестанет работать и получит ожидаемое значение 3.
Теперь, пример, подобный тому, который у вас есть, будет полностью поточно-ориентированным,независимо от того, что:
int incrementCount(int count) {
count++;
// ... Do some other stuff
return this.count;
}
Поскольку единственные переменные, к которым мы прикасаемся, полностью локальны для функции, нет случая, когда два потока, обращающиеся к ней одновременно, могли бы попытаться работать с данными, отличающимися от другого.Это сделало бы его потокобезопасным.
Итак, чтобы ответить на вопрос, предполагая, что функции ничего не изменяют вне определенной вызываемой функции, тогда да, класс можно считать поточно-ориентированным.