Являются ли статические переменные специфичными для потока в java?

#java

#java

Вопрос:

Являются ли статические переменные специфичными для потока, означает

 class A {
    public static int i = 10;
} 

Class B {
    A.i = 20;
}

Class C {
    A.i = 30;
}

Class D {
    System.out.println(A.i);
}
  

Вышеуказанные классы я вызываю из своего веб-приложения, т. е. в первом запросе я вызываю класс B, во втором запросе я вызываю класс B, а в третьем запросе я вызвал класс D. Теперь, что он будет печатать 20.10.30?

Спасибо.

Комментарии:

1. Ваш пример кода даже не компилируется. Пожалуйста, покажите нам компиляционный код.

2. Я не думаю, что требуется компиляция примера кода. Для людей нет ничего необычного в том, что они публикуют урезанные версии своего кода. Важно то, что вы можете получить хорошее представление о том, что они пытаются сделать. Что в данном случае вы можете.

Ответ №1:

Нет, используйте для этого ThreadLocal.

Ответ №2:

Правильный ответ на ваш вопрос (будет ли он напечатан 10/20/30?), предполагающий, что каждый запрос может обрабатываться другим потоком, — «да».

По логике вещей, если каждый из этих запросов выполняется в хронологическом порядке и каждый в другом потоке, то вы увидите 20 (значение не зависит от потока, о чем, я думаю, вы спрашиваете), но обратите внимание, что даже если вызов D происходит хронологически последним, он все равно может видеть значение ’10’; поле не является ни окончательным, ни изменяемым, поэтому модель памяти Java не дает гарантий относительно ТОГО, КОГДА изменение на 20 будет видно другим потокам.

Ответ №3:

Нет, они зависят от загруженного класса

Ответ №4:

статические переменные являются глобальными и разделяются между потоками. это означает, что в вашем примере (B -> C -> D) d выведет 30 (только если они вызываются в таком порядке

это связано с некоторыми проблемами синхронизации, о которых вы, возможно, захотите знать…

Ответ №5:

Статические переменные являются глобальными, что означает, что вы можете вносить в них изменения, где хотите, а переменная will имеет конечное значение, которое вы ей присвоили.В методе, если переменная является частной, вы вносите изменения, но вне метода эта переменная будет иметь то же значение перед вычислением метода.В конечном итоге этот код покажет вам 30.