1) Я не думаю, что существуют атомарные операции, если вы не защищаете их (синхронизация и другие технические приемы).
2) При этом это не относится к вашему примеру.
В вашем примере у вас есть.
a) Звоните q.remove()
b) q.remove()
делает свою работу (потокобезопасно или нет).
c) q.remove()
возвращает результат
d) Результат присваивается element
(это назначение !! все до этого только вычисляли значение для назначения).
Итак,это не только если присваивание (последний шаг в вашей операции) является атомарным или нет, вы должны убедиться, что q.remove () тоже атомарное.И я уверяю вас, что это не так.
Поскольку это не потокобезопасно, если вы хотите избежать одновременного доступа, вы должны синхронизировать весь блок.
РЕДАКТИРОВАТЬ, отвечая на комментарии авторов.
Итак, что вы спрашиваете, если каким-то образом q.peek()
вернет элемент, но другой закончится в topRank
из-за того, что другой поток связался с ним, не так ли?
Если толькоtopRank
совместно используется разными потоками, это невозможно:
a) q.peek()
выполняет свою логику
b) возвращаемое значение q.peek()
копируется (сохраняется встек, обратно к выражению, которое называется q.peek()
)
c) q.peek()
выход.Только теперь другие экземпляры могут получить доступ к синхронизированному разделу для изменения q.state, но возвращаемое значение уже скопировано в стек.
d) Копия в стеке присвоена topRank