Статическая переменная занимает только одну ячейку памяти для всех запущенных потоков? - PullRequest
3 голосов
/ 27 января 2010

Учитывая, что статическая переменная класса занимает только одну ячейку памяти, является ли она общей для всех потоков процесса? Или одна ячейка памяти для такой переменной создана для каждого из запущенных потоков?

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

Ответы [ 3 ]

3 голосов
/ 27 января 2010

static переменная class в процессе будет разделена между всеми потоками, содержащимися в этом процессе.

Вы можете проверить это, создав простое class с полем public static, а затем запустите пару Threads и попросите их увеличить переменную и посмотреть, что произойдет.

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

class Foo {

    private static int aVariable = 0;

    public static synchronized void increment() { aVariable++; }
    public static synchronized int getVariable() { return aVariable; }

}
2 голосов
/ 27 января 2010

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

1 голос
/ 27 января 2010

Статические поля являются общими для всех потоков. В JVM есть только одна копия поля.

Для управления доступом к статическому полю вы можете использовать ключевое слово synchronized или использовать утилиты параллелизма , предоставляемые JDK 5.0.

Существует способ создать переменную, которая имеет один экземпляр на поток, см. ThreadLocal .

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