Область свойств системы
По крайней мере, из чтения спецификаций 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
потокобезопасен< /em>, поэтому я ожидал, что Properties
будет таким же, и на самом деле Спецификации API для Properties
подтверждает это:
Этот класс является потокобезопасным: несколько потоков могут совместно использовать один объект Properties
без необходимости внешней синхронизации., Сериализованная форма
person
coobird
schedule
26.05.2009