Есть ли смысл делать метод synchronized, если он не использует глобальные переменные?
Предположим у меня несколько потоков. Все они с разными входными данными должны войти в метод
public int MyMeth(int x, int y){
... //какая-то реализация зависящая только от входных данных
return x*y;
}
Есть ли смысл (в многопоточной среде) делать такой метод synchronized, если он не использует никакие глобальные переменные, и не вызывает какие-либо функции, которые используют глобальные переменные?
Ответы (2 шт):
Если под глобальными переменными подразумеваются в том числе и поля этого класса, а в качестве входных параметров используются только примитивные типы или константные объекты, то тогда synchronized не нужен.
Но в этом случае, чтобы избежать ненужных ошибок, лучше объявить метод статическим. В этом случае, при попытке обращения из метода к полям класса или другим нестатическим методам компилятор сразу сообщит об ошибке
Я бы ратовал за явное указание synchronized каждый раз, проиллюстрирую примерами:
Очевидный пример thread-safe метода:
int myMethod1(int a, int b) {
return (a+b);
}
Менее очевидный пример thread-safe метода:
int myMethod2(int a, int b) {
int c = Math.power(a, b); //мы понимаем, что аппроксимация power() thread-safe
return c;
}
Уже не thread-safe метод, используется разделяемый ресурс System.in
int myMethod3(int a, int b) {
Scanner scan = new Scanner(System.in);
int c = scan.nextInt();
return (a + b + c);
}
Пример метода с неизвестной thread-safety
int myMethod4(int a, int b) {
int c = function(a, b); //метод function - является ли thread-safe - полезем в исходники?!
return c;
}
Приведение примера выше к thread-safety
synchronized int myMethod4(int a, int b) {
int c = function(a, b);
return c;
}
Мессидж мой в том, что метод иногда может быть сам по себе довольно сложным и чтобы не гадать на кофейной гуще, хотя бы с точки зрения улучшения читаемости кода лучше таки ставить synchronized