Объем статических переменных класса в Java

По умолчанию они связываются с Ctrl + Numpad_Minus и Ctrl + Numpad_Plus , но можно снова переплести их.

12
задан Ankit Khettry 27 June 2016 в 08:15
поделиться

4 ответа

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

Не могли бы вы подробнее рассказать о механизме блокировки, который вы здесь упомянули:

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

?

Потому что это не звучит так, как будто вы используете встроенные методы блокировки и синхронизации в Java.

Что-то вроде этого должно помешать потокам читать объект Properties, пока другой поток обновляет его:

static Object lockObject = new Object();

...

synchronized(lockObject) {
     // access the Properties object
}

Обратите внимание, что вам нужно будет делать это каждый раз, когда вы обращаетесь к объекту Properties,

3
ответ дан 2 December 2019 в 05:54
поделиться

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

5
ответ дан 2 December 2019 в 05:54
поделиться

Статика «не является общей для всех экземпляров класса» - они не связаны с экземплярами; они принадлежат к самому типу . В частности, статические переменные вполне могут использоваться без создания каких-либо экземпляров.

Это дает ключ к пониманию объема статики: они ограничены объектом Class , представляющим содержащий класс, который, в свою очередь, находится в области видимости загрузчика ClassLoader , который его загрузил.

В зависимости от того, где размещена библиотека, статическая переменная может относиться к JVM или веб-приложению - или, возможно, что-то в между ними, если Tomcat поддерживает множественный хостинг (не могу вспомнить).

Посмотрите в документации Tomcat, как расположены библиотеки и как они соотносятся с загрузчиками классов. Например, здесь ' s практическое руководство Tomcat 6.0 ClassLoader и эквивалент 5.5 .

Как работает ваша логическая «блокировка»? Вам действительно следует использовать правильную блокировку ( synchronized ), чтобы гарантировать, что каждое использование объекта свойств (как чтение, так и запись, включая блокировку в течение всего периода, в течение которого вы выполняете итерацию) заблокировано соответствующим образом.

Вместо изменения "живого" объекта Properties , рассматривали ли вы его как неизменяемый - поэтому, когда вы хотите обновить свойства, вы берете копию, изменяете ее, а затем делаете копию " живая »версия? Вам все равно придется не допускать одновременного внесения изменений двумя разными потоками (иначе вы потеряете некоторые), но это, вероятно, сделает сторону чтения намного проще и эффективнее.

18
ответ дан 2 December 2019 в 05:54
поделиться

Может быть, проблема в загрузчике классов, когда jar-файл, содержащий ваш класс, дублируется в каждой WEB-INF / lib ваших различных приложений? Если так, я бы попытался добавить эту банку в библиотеки Tomcat, а не в приложение.

0
ответ дан 2 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: