【发布时间】:2016-02-08 16:26:51
【问题描述】:
在基于 struts 2 和 spring web 的应用程序中,请考虑以下示例。
BookManager 有一个动作,它向客户端返回书籍的Map。它从 Spring 的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());
}
}
服务层从 DB 中获取图书列表并返回一个 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;
}
}
我已经测试并发现上面的实现是不是线程安全的。
- 我可以通过从
BookService中删除私有字段books来使代码线程安全,并像方法HashMap<String,BookVO>() books = new HashMap<String,BookVO>();一样使用它。为什么此更改使代码线程安全? - struts 动作是线程安全的,这不应该确保即使是非线程安全的 spring 服务也以线程安全的方式运行。
- 如果我在操作中使用非线程安全版本的服务,通过创建
new服务对象而不是使用弹簧注入,我将不会遇到任何问题。为什么?如果服务不是线程安全的,为什么要创建一个新实例并调用它是线程安全的!
【问题讨论】:
-
如果操作不是线程安全的,则不会。
标签: java spring multithreading struts2 cdi