Если метод не использует поля объекта, тогда это потокобезопасно? - PullRequest
4 голосов
/ 11 мая 2010

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

Можем ли мы сказать, что это потокобезопасно?

Ответы [ 4 ]

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

Так называемая чистая функция действительно поточно-ориентирована, но только если нет абсолютно никаких побочных эффектов (т. Е. Объекты передаются через измененные параметры).

3 голосов
/ 11 мая 2010

Если локальные переменные-члены не изменены, и состояние передаваемых параметров не изменится (т.е. с помощью методов для этих параметров), то это потокобезопасно.

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

public class Foo{
    private int count = 1;
    public void incrementFoo(){
        count += 1;
    }
    public int getFoo(){
        return count;
    }
}

private int multiplier = 5;
//Not safe
public static int calculateFoo(final Foo myFoo){
    //you can still do this, even if myFoo is final
    myFoo.incrementFoo();
    return myFoo.getFoo() * multiplier;
}
1 голос
/ 11 мая 2010

Это зависит. Есть способы, которыми это может быть легко не потокобезопасным.

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

// HashMap is not thread safe
public void foo(String key, HashMap<String,String> map) {
  String value = map.get(key);
  if (value == null) {
    map.put(key, "new value");
  }
}

Другая возможность, если какой-либо объект, созданный в методе, экранируется от метода. Учтите следующее:

public void foo() {
  Map map = ...; // create and populate the map
  ListenerQueue.getQueue().add(map); // there are listener threads waiting on this queue
  // do some other work
}

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

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

Да, это потокобезопасно. Это не может мешать вызовам других методов. (Если только у него нет других неприятных побочных эффектов.)

Любое чередование инструкций этого метода и инструкций любого другого метода будет в порядке.

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