Ответ 1
Область свойств системы
По крайней мере, от чтения спецификаций 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
объекта без необходимости внешнего синхронизация., Сериализованная форма