Можно ли получить доступ к статическим методам класса несколькими экземплярами объекта одновременно? - PullRequest
5 голосов
/ 30 мая 2010

Пример:

ThisClass.staticMethod(Object... parameters);

будут доступны для нескольких экземпляров других объектов и одновременно.

Будут ли какие-либо зависимости с этими другими объектами, когда они используют один и тот же статический метод в одно и то же время?

Ответы [ 4 ]

9 голосов
/ 30 мая 2010

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

Пример: Math.max (int a, int b) является статическим методом, но не использует статические объекты, поэтому нет никаких зависимостей.

Пример 2. Здесь все вызовы имеют одну и ту же переменную результата, два параллельных вызова staticMethod могут привести к неверным результатам.

private static int result = 0;
private static int staticMethod(Object... args)
{
      result = args.length;
      //Do Something
      return result;
}

Пример 3: Этот потокобезопасный, если ни один из аргументов не является общим, каждый вызов имеет свой собственный экземпляр результата.

private static int staticMethod(Object... args)
{
    int result = 0;
    result = args.length;
    //Do something
    return result;
}

Пример 4. Этот класс использует класс в качестве блокировки для предотвращения параллельного доступа к функциям класса. Только один вызов staticMethod выполняет все остальные, ждут

private static int result = 0;
private static synchronized int staticMethod(Object... args)
{
      result = args.length;
      //Do Something
      return result;
}
1 голос
/ 30 мая 2010

Фрагмент кода, запущенный одновременно несколькими потоками, может вызвать условия гонки , независимо от того, где размещен этот код (статический / нестатический метод).

Необходимо выполнитьубедитесь, что данные, которыми манипулирует код, допускает одновременный доступ, и при необходимости синхронизируйте код должным образом.

1 голос
/ 30 мая 2010

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

1 голос
/ 30 мая 2010

Очевидно, что все пользователи метода зависят от класса, если вы это имеете в виду.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...