Выделяются ли статические поля Java несколько раз при многопоточности? - PullRequest
3 голосов
/ 14 марта 2012

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

Ответы [ 3 ]

8 голосов
/ 14 марта 2012

Нет, только один экземпляр статической переменной для каждого ClassLoader.

 public class Foo {
      // only 1 of these
      private static int bar = 10;
 }

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

1 голос
/ 14 марта 2012

Статические переменные явно не распределяются в зависимости от количества потоков. Вместо этого статические переменные выделяются один раз в ClassLoader.

0 голосов
/ 14 марта 2012

Если вы используете «огромный» объем памяти, например, много ГБ, я бы использовал профилировщик памяти, чтобы найти причину и исправить ее, если сможете.Если вы используете несколько сотен МБ, я не буду беспокоиться об этом, если вы не знаете, что это проблема.

...