Можно ли определить переменную volatile как статическую в Java? - PullRequest
20 голосов
/ 27 марта 2011

Могу ли я объявить что-то вроде этого?

static volatile boolean first=false;

Ответы [ 4 ]

58 голосов
/ 27 марта 2011

Чтобы расширить комментарий Майкла.

static означает просто не связанный с экземпляром содержащего класса.

volatile просто означает, что значение может быть изменено другими потоками без предупреждения.

Итак, ваш вопрос сводится к тому, "может ли поле, не связанное с экземпляром содержащего класса, быть изменено другим потоком без предупреждения?"

Как указал Майкл, ответ на этот вопрос - да. Ассоциация экземпляров ортогональна параллельной модификации.

19 голосов
/ 27 марта 2011

Да, вы можете.

Переменная static в Java сохраняется один раз для каждого класса (не один раз для объекта, как, например, нестатические переменные). Это означает, что все ваши объекты (и статические методы) имеют одну и ту же переменную.

Объявление переменной как volatile (будь то static или нет) указывает на то, что переменная будет часто использоваться несколькими потоками. В Java это сводится к тому, чтобы указывать потокам, что они не могут кэшировать значение переменной, но должны будут немедленно выполнить обратную запись после изменения, чтобы другие потоки увидели изменение. (По умолчанию потоки в Java могут кэшировать переменные).

7 голосов
/ 27 марта 2011

Конечно. Эффекты двух модификаторов полностью ортогональны.

0 голосов
/ 24 октября 2018

да, вы можете.

static boolean first=false;

Когда вы объявляете статическую переменную, будет только одна копия для всех объектов, независимо от того, сколько объектов класса создано.Каждый поток будет иметь свою собственную кэшированную копию.

Если он является энергозависимым, поток должен каждый раз заходить в память и получать обновленное значение переменной.

static volatile boolean first=false;

Это будет

заставляет поток каждый раз читать память непосредственно

, чтобы сначала найти значение переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...