Нужно ли синхронизировать поток, изменяющий только локальную переменную? - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть сомнения по поводу механизма синхронизации Java.Давайте возьмем следующий фрагмент кода:

  class A {
     int instance=0;
     synchronized void met1() {
       instance=instance +1;
        ....
        instance = instance+2*3;

      }

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

class A {

     synchronized void met1() {
       local=local +1;
        ....
        local = local+2*3;

      }

Метод met1 модифицирует локальную переменную, которая, я думаю, будет уникальной для каждого потока, выполняющего этот метод.Таким образом, в этом случае, когда поток изменяет только локальную переменную, необходимо ли синхронизировать метод?

Ответы [ 7 ]

3 голосов
/ 05 декабря 2011

Если переменная объявлена ​​внутри met1, нет, вам не нужно synchronized.

0 голосов
/ 05 декабря 2011

Во втором примере local не совсем локальный, потому что вы не объявляете его внутри met1.Возможно, вы имели в виду:

 synchronized void met1() {
   int local = 0;
   // ...
   local=local +1;
    ....
    local = local+2*3;

  }

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

0 голосов
/ 05 декабря 2011

Вам не нужно беспокоиться о локальных переменных в многопоточной среде. Вам не нужно синхронизировать его. Но в вашем коде переменная "local" не определена как локальная переменная в met1 ().

0 голосов
/ 05 декабря 2011

Нет, нет необходимости синхронизировать метод, который только изменяет локальные переменные и не изменяет состояние объектов

0 голосов
/ 05 декабря 2011

Нет.Если метод изменяет только локальные переменные и аргументы метода, вам не нужно синхронизировать метод.Чем больше у вас классов и состояний, и тем меньше синхронизация вам нужна.

0 голосов
/ 05 декабря 2011

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

Правила Java-параллелизма сложнее, чем вы думаете, и здесь есть множество хитростей, поэтому стоит разобраться в тонкостях. "Java Concurrency in Practice" Гетца и его коллег довольно хорош (и в основном из уст лошадей).

0 голосов
/ 05 декабря 2011

Нет, если переменная действительно локальная для метода - однако ваш пример кода на самом деле не показывает локальную декларацию! Так что не распространяйте этот пример вокруг ...

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