2012-02-09 3 views
2

У меня есть реализация шаблона стратегии, как показано ниже:Static Instance Потокобезопасный

public class ConcreteStrategy implements Strategy { 

     public static final Strategy INSTANCE = new ConcreteStrategy(); 

     public AClass execute(AClass aClass){ 
       //...do somthing 
       return aClass; 
     } 
    } 

Игнорирование плохой практики возврата входного параметра, статический экземпляр INSTANCE использование поточно?

+3

Кстати, добавьте частный конструктор, чтобы вы знали, что никто не создает другой экземпляр ConcreteStrategy (в случае, если это нужно поведение :) – helios

+0

И сделайте класс 'final', пока вы об этом. –

ответ

2

Предполагая, что ConcreteStrategy не изменен или изменен только потокобезопасным способом, то да. Модификатор final обеспечит (в Java 1.5+), что все потоки видят объект INSTANCE, по крайней мере, в том состоянии, в котором он был, когда был инициализирован класс. Любое последующее изменение объекта должно быть выполнено поточно-безопасным обычным способом (через летучие компоненты, синхронизацию, классы, обеспечивающие безопасность потоков и т. Д.).

+0

исправьте меня, если я ошибаюсь: когда я вызываю функцию, экземпляр копии объекта передается методу, поэтому каждый раз, когда метод выполняется на другом объекте. Класс используется в webapp, звонки разделяют только код? – landal79

+1

@ landal79: Java передает копии ссылок. Таким образом, параметр «aClass» является копией ссылки. НО используемый и возвращаемый объект AClass тот же. Подумайте об этом как о указателях. Вы можете передавать указатели, копию указателей и т. Д., Но заостренный объект тот же. Если есть ОДИН 'новый', есть ОДИН объект. – helios

+0

«Конечная полевая семантика» нового JMM здесь не имеет значения. Все потоки будут видеть полностью инициализированный класс «ConcreteStrategy», как только статический инициализатор завершит свою работу, если он не сделает что-то действительно глупое. –

1

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

Ваш пример почти нить безопасная.

ссылка на INSTANCE является потокобезопасной, поскольку она является окончательной. Но содержимое ConcreteStrategy может быть очень хорошим, не Thread safe (мы не видим код, поэтому не можем сказать).

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

Cheers, Eugene.

+0

Предположим, что 'execute()' метод выполняется только по параметру – landal79

+0

@ landal79 Я не понял, что вы имеете в виду, выполнив только один параметр. Можете ли вы быть немного более подробным plz? – Eugene

+0

Метод 'execute()' выполняет некоторую оценку по значению полей экземпляра 'aClass', а класс ConcreteStrategy не имеет внутреннего состояния, а является только алгоритмом. – landal79

Смежные вопросы