2016-02-08 4 views
1

В стойках 2 и на пружинной основе, пожалуйста, рассмотрите ниже образец.Резьбовые столы с веб-приложением с пружиной

BookManager имеет действие, которое возвращает клиенту Map книг. Он получить карту от службы слоя, который injected к весне

public class BookManager extends ActionSupport { 

    //with setter and getter 
    private Map<String, BookVO> books; 

    @inject 
    BookService bookservice 

    @Action("book-form") 
    public String form(){  
     setBooks(bookservice.getAllBooks()); 
    } 

} 

Уровень обслуживания получает список книг из БД ап возвращает MAP.

@Named 
public class BookService(){ 

    private Map<String,BookVO> books; 

    public Map<String,BookVO> getAllBooks(){ 
     books = new HashMap<String,BookVO>(); 
     //fill books from DB 
     return books; 
    } 

} 

Я проверил и обнаружил, что выше реализация не Потокобезопасная.

  1. я могу сделать код поточно путем удаления частного поля books из BookService и использовать его как метод HashMap<String,BookVO>() books = new HashMap<String,BookVO>();. Почему это изменение делает поток кода безопасным?
  2. Действие стойки является потокобезопасным, это не должно зависеть от того, что безопасная пружинная система без резьбы работает в потоковом режиме.
  3. Если я использую безошибочную безопасную версию сервиса в своем действии, создав объект службы new вместо использования весеннего впрыска, я не стану проблемой. Зачем? Если служба не является потокобезопасной, почему создание нового экземпляра и вызов его будет потокобезопасным!
+0

Это не будет, если действие не является потокобезопасным. –

ответ

1

я могу сделать код нить безопасным удалением частных книг полей из BookService и использовать его как метод HashMap() книги = новый HashMap() ;. Почему это изменение делает поток кода безопасным?

Поскольку переменные уровня метода являются потокобезопасными, а переменные уровня класса - нет.

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

Nope. Это зависит.

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

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

Если вместо этого у вас есть DI, управляемый контейнером, экземпляр не является потокобезопасным; то, что вы используете (@Inject, @Named) больше, чем «Весна», это Java EE, представляет собой реализацию JSR-330 (Injection Dependency Injection), доступную только в приложениях с поддержкой CDI (JSR-299).
CDI beans не являются потокобезопасными. Вы должны использовать EJB3's @Singleton for this to be thread-safe, но вам действительно не нужно сохранять этот атрибут на уровне класса, так как он используется только для возврата, а затем оставлен там для перезаписывания в следующий раз.

BTW рассмотрите возможность использования ссылки CDI (Weld in JBOSS) с Struts2 CDI-plugin, это стоит попробовать.