Не имеет значения, если это делается на разных процессорах или нет. Когда у вас нет многопроцессорных процессоров, вы все равно можете столкнуться с проблемами параллелизма, поскольку контекстные переключатели могут возникать в любое время.
Если поле не изменчиво, оно все равно может находиться в кеше одного потока, в то время как его контекст отключен, и переключается контекст другого потока. В этом случае поток, который только что захватил (один) процессор, не будет что поле изменилось.
Поскольку эти вещи могут случиться даже с одним процессором, они должны произойти с более чем одним процессором, так что вам действительно необходимо защитить ваши общие данные.
Независимо от того, является ли volatile
правильным или нет, зависит от типа и того, с каким видом вы пытаетесь защитить. Но опять же, это не имеет никакого отношения к числу процессоров.
Если поле является ссылочным типом, то volatile
обеспечивает только гибкость новых заданий в поле. Он не защищает от изменений в объекте, на который он указывает, - для этого вам нужно синхронизировать.
Какой тип переменной? – weston
@weston «Переменная экземпляра» - это то же самое, что и «поле». – RealSkeptic
Я думаю, вы должны опубликовать код, который слишком туман, что происходит. Вы обновляете ссылку или содержимое этого типа? – weston