Использование синхронизированного вам здесь не поможет.В вашем примере synchronized
делает только то, что два потока не могут одновременно вызывать ваш синхронизированный метод .
public class Foo {
public static synchronized void bar() {
//...
}
}
точно так же, как
public class Foo {
public static void bar() {
synchronized (Foo.class) {
//...
}
}
}
т. е. только код, который может видеть Foo.class
и синхронизировать его, будет зависеть от вашей синхронизации.Поскольку код в любых библиотеках, которые вы вызываете, явно не знает о Foo.class, синхронизация с ним не будет иметь никакого эффекта.
Если вы хотите гарантировать , что эти системные свойства установлены ранеелюбой код, который может прочитать значения, может быть запущен, самый пуленепробиваемый способ - передать их в качестве аргументов -D команде java, которая запускает JVM, например, java -DresponderURL=http://foo.bar
.
Следующий лучший подход -как вы делаете, установите свойства в некотором методе, называемом в начале запуска VM .Всегда желательно делать это с аргументами командной строки, если это возможно, по этой причине: если какие-либо такие свойства читаются в статических блоках {} в библиотеках, которые вы используете, эти блоки могут выполнятьсядо того, как ваш код сделает, потому что верификатор байт-кода Java может вызвать инициализацию этих классов до того, как ваш код сделает что-либо, что вызывает их (вы можете избежать этого, передав -Xverify:none
команде Java, но если вы можете сделать это, вы также можетевсе равно просто установите там системные свойства).