Есть ли смысл делать метод synchronized, если он не использует глобальные переменные?

Предположим у меня несколько потоков. Все они с разными входными данными должны войти в метод

public int MyMeth(int x, int y){
... //какая-то реализация зависящая только от входных данных
return x*y;
}

Есть ли смысл (в многопоточной среде) делать такой метод synchronized, если он не использует никакие глобальные переменные, и не вызывает какие-либо функции, которые используют глобальные переменные?


Ответы (2 шт):

Автор решения: Anton Shchyrov

Если под глобальными переменными подразумеваются в том числе и поля этого класса, а в качестве входных параметров используются только примитивные типы или константные объекты, то тогда synchronized не нужен.

Но в этом случае, чтобы избежать ненужных ошибок, лучше объявить метод статическим. В этом случае, при попытке обращения из метода к полям класса или другим нестатическим методам компилятор сразу сообщит об ошибке

→ Ссылка
Автор решения: Barmaley

Я бы ратовал за явное указание 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

→ Ссылка