Поле Stati c final инициализировано несколько раз - PullRequest
0 голосов
/ 13 июля 2020

Представьте себе проект java, содержащий 2 приложения. Для каждого из них: класс с основным методом для запуска приложения, скажем, Main1 и Main2. Оба приложения используют общий класс Service, содержащий последнее поле stati c:

public class Main1 {

    public static void main(String[] args) throws InterruptedException {
        for (int i =0;i<3;i++){
            System.out.println("I'm application number 1. Time =" + Service.time);
            sleep(1000);
        }
    }
}
public class Main2 {

    public static void main(String[] args) throws InterruptedException {
        for (int i =0;i<3;i++){
            System.out.println("I'm application number 2. Time =" + Service.time);
            sleep(1000);
        }
    }
}

public class Service {
    public final static LocalDateTime time = LocalDateTime.now();
}

Результат меня как-то удивил. Кажется, что у Main1 и Main2 есть своя собственная версия Service:

I'm application number 1. Time =2020-07-13T17:04:55.155497300
I'm application number 1. Time =2020-07-13T17:04:55.155497300
I'm application number 1. Time =2020-07-13T17:04:55.155497300

I'm application number 2. Time =2020-07-13T17:04:58.800497300
I'm application number 2. Time =2020-07-13T17:04:58.800497300
I'm application number 2. Time =2020-07-13T17:04:58.800497300

Я повторил опыт с классом Service, используемым двумя потоками. Результат был другим: time был инициализирован только один раз. Я немного пытаюсь понять это. Может ли кто-нибудь помочь мне понять, что происходит за кулисами?

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Ага, конечно, у обеих программ есть своя версия вашего Service. Один раз это переменная stati c первой программы, а другой - переменная stati c второй программы.

Service не будет иметь одинаковой памяти. А разница во времени - это просто итеративная работа ваших программ.

Если вы хотите иметь только 1 Service, вы можете работать с шаблоном синглтона . Но это должно быть в той же программе.

1 голос
/ 13 июля 2020

Main1 и Main2 - это полностью отдельные процессы на системном уровне и отдельные JVM. Потоки работают в одной JVM, поэтому значение одинаковое.

Чтобы 2 JVM видели одно и то же значение, это значение должно быть где-то вне - network, dis c, windows registry , что угодно, но снаружи.

Для поведения, которое вы ожидали, вам потребуются намного более сильные механизмы, чем простой static (например, Hazelcast ).

...