Scope of the System properties
At least from reading the API Specifications for the System.setProperties
method, I was unable to get an answer whether the system properties are shared by all instances of the JVM or not.
In order to find out, I wrote two quick programs that will set the system property via System.setProperty
, using the same key, but different values:
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) {}
}
}
}
(Beware that running the two programs above will make them go into an infinite loop!)
It turns out, when running the two programs using two separate java
processes, the value for the property set in one JVM process does not affect the value of the other JVM process.
I should add that this is the results for using Sun's JRE 1.6.0_12, and this behavior isn't defined at least in the API specifications (or I haven't been able to find it), the behaviors may vary.
Are there any tools to monitor runtime changes
Not to my knowledge. However, if one does need to check if there were changes to the system properties, one can hold onto a copy of the Properties
at one time, and compare it with another call to System.getProperties
-- after all, Properties
is a subclass of Hashtable
, so comparison would be performed in a similar manner.
Following is a program that demonstrates a way to check if there has been changes to the system properties. Probably not an elegant method, but it seems to do its job:
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()));
}
}
Properties is not thread-safe?
Hashtable
is thread-safe, so I was expecting that Properties
would be as well, and in fact, the API Specifications for the Properties
class confirms it:
This class is thread-safe: multiple
threads can share a single Properties
object without the need for external
synchronization., Serialized Form