Ответ 1
Многопоточные проблемы. По умолчанию Spring beans являются одноточечными.
Простой класс калькулятора, подключенный как Spring bean в веб-приложении:
public class Calculator {
int result;
public int addTwoNumbers(int first, int second) {
result = first + second;
return result;
}
}
Что может помешать этому?
Многопоточные проблемы. По умолчанию Spring beans являются одноточечными.
Целочисленное переполнение - еще одна проблема, если это считается.
Чтобы решить эту проблему, вы можете вернуть long
вместо:
long result;
public long addTwoNumbers(int first, int second)
{
result = (long)first + second;
return result;
}
Будьте осторожны, просто говоря result = first + second;
, поскольку два int
будут добавлены, давая int
(который может переполняться), который будет только тогда преобразован в long
.
result = (long)first + second;
эквивалентен result = ((long)first) + second;
(not result = (long)(first + second);
), что означает, что мы сначала конвертируем один из int
в long
, поэтому это будет long + int
, что дает long
.
Этот класс не является потокобезопасным, если предположить, что это Spring singleton bean. Если два вызова потока addTwoNumbers есть вероятность, что первый поток получит результат вычисления второго потока, поэтому мы можем получить 2 + 2 = 5. Если поле результата не должно использоваться где-либо еще, оно должно быть избавлено от
public class Calculator {
public int addTwoNumbers(int first, int second) {
return first + second;
}
}