先看这么一段代码:
@Service
public class AccountService {
private String message;
public void foo1() {
if (true) {
this.message = "a";
} else {
this.message = "b";
}
}
public void foo2() {
// 修改this.message的代码...
// ... ...
}
}如果你打算在@Controller里这么调用AccountService :
accountService.foo1();
model.addAttribute(accountService.getMessage());那么就有线程安全的危险了。
问题原因
解决方法
@Service
@Scope("request")
public class AccountService {
private String message;class MessageWrapper {
private String message;
public MessageWrapper(String msg) {
this.message = msg;
}
// 只提供get方法
public String getMessage() {
return this.message;
}
}AccountService的foo1()方法修改如下:
@Service
public class AccountService {
public MessageWrapper foo1() {
if (true) {
return new MessageWrapper("a");
} else {
return new MessageWrapper("b");
}
// ... ...
}这样便可以完美避免线程安全问题,又不会带来过多的额外开销。
2695



被折叠的 条评论
为什么被折叠?



