Сфера свойств системы
По крайней мере, прочитав спецификации API для метода System.setProperties
, я не смог получить ответ, являются ли системные свойства общими для всех экземпляров JVM или нет.
Чтобы выяснить это, я написал две быстрые программы, которые будут устанавливать системное свойство через System.setProperty
, используя тот же ключ, но разные значения:
class T1 {
public static void main(String[] s) {
System.setProperty("dummy.property", "42");
// Keep printing value of "dummy.property" forever.
while (true) {
System.out.println(System.getProperty("dummy.property"));
try {
Thread.sleep(500);
} catch (Exception e) {}
}
}
}
class T2 {
public static void main(String[] s) {
System.setProperty("dummy.property", "52");
// Keep printing value of "dummy.property" forever.
while (true) {
System.out.println(System.getProperty("dummy.property"));
try {
Thread.sleep(500);
} catch (Exception e) {}
}
}
}
(Остерегайтесь того, что запуск двух вышеперечисленных программ приведет их в бесконечный цикл!)
Оказывается, при запуске двух программ с использованием двух отдельных процессов java
значение свойства, установленное в одном процессе JVM, не влияет на значение другого процесса JVM.
Я должен добавить, что это результаты использования Sun JRE 1.6.0_12, и это поведение не определено, по крайней мере, в спецификациях API (или я не смог его найти), поведение может отличаться.
Существуют ли инструменты для отслеживания изменений во время выполнения
Не в моих силах. Однако, если нужно проверить, были ли изменения в системных свойствах, можно одновременно удержать копию Properties
и сравнить ее с другим вызовом System.getProperties
- в конце концов, Properties
является подклассом Hashtable
, поэтому сравнение будет выполняться аналогичным образом.
Ниже приведена программа, которая демонстрирует способ проверки наличия изменений в системных свойствах. Вероятно, не элегантный метод, но, кажется, делает свою работу:
import java.util.*;
class CheckChanges {
private static boolean isDifferent(Properties p1, Properties p2) {
Set<Map.Entry<Object, Object>> p1EntrySet = p1.entrySet();
Set<Map.Entry<Object, Object>> p2EntrySet = p2.entrySet();
// Check that the key/value pairs are the same in the entry sets
// obtained from the two Properties.
// If there is an difference, return true.
for (Map.Entry<Object, Object> e : p1EntrySet) {
if (!p2EntrySet.contains(e))
return true;
}
for (Map.Entry<Object, Object> e : p2EntrySet) {
if (!p1EntrySet.contains(e))
return true;
}
return false;
}
public static void main(String[] s)
{
// System properties prior to modification.
Properties p = (Properties)System.getProperties().clone();
// Modification of system properties.
System.setProperty("dummy.property", "42");
// See if there was modification. The output is "false"
System.out.println(isDifferent(p, System.getProperties()));
}
}
Свойства не поточнобезопасны?
Hashtable
является поточно-ориентированным , поэтому я ожидал, что Properties
также будет, и фактически, спецификации API для Properties
класс подтверждает это:
Этот класс является поточно-ориентированным: несколько
темы могут делиться одним Properties
объект без необходимости внешнего
синхронизация., Сериализованная форма