Параллельный статический контекст - PullRequest
0 голосов
/ 24 августа 2018

Я хотел бы понять, как работает статический контекст в многопоточном окружении.Если у вас есть статический метод в классе, скажем «ContainerClass.notSafeStaticMethod ();»и вы вызываете его из разных потоков одновременно.

Являются ли переменные внутри метода общими?

public class ContainerClass{
    public static String notSafeStaticMethod(String stringParameter) {

        String localString = stringParameter + "1";
        localString += "2";
        localString += "3";

        return localString;
    }
}

Тогда два потока вызывают его одновременно:

  ContainerClass.notSafeStaticMethod( "first Call"); /*Thread 1 is executing*/
  ContainerClass.notSafeStaticMethod( "Second Call"); /*Thread 2 starts executing before thread 1 finishes*/ 

Что будет с внутренним состоянием функции?Кроме того, что произойдет со значением полученного параметра?

Будет ли одно значение для каждого или они совместно используют одну и ту же память?

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

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

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

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

Кстати, вложенные классы могут быть помечены как статические, это означает, что только объекты этого класса не имеют ссылки на объект объявленного им класса.как вложенный внутри (см. пример java.util.Map.Entry).static в этом контексте не означает, что переменные или методы в классе являются статическими.Это просто Java-разработчики, повторно использующие существующее ключевое слово, поэтому они не рискуют нарушить существующий код.

public class Example {

    static int staticVariableHere;

    public static int staticMethodHere(String methodArg) {
        int localVariable = 42;
        return localVariable;
    }
}
0 голосов
/ 24 августа 2018

Локальные переменные изолированы. Это включает в себя параметры метода. Каждый поток имеет свой собственный стек, и локальные переменные, связанные с вызовами методов в этом потоке, хранятся в памяти стека этого потока.

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

Осторожность требуется только для общих переменных (например, если localString объявлено как статическое поле в классе или общие переменные переданы как аргументы метода), где потоки могут перезаписывать изменения друг друга, если не будет выполнена правильная синхронизация.

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