案例一
public class MyServlet extends HttpServlet {
// 是否安全?
Map<String,Object> map = new HashMap<>();
// 是否安全?
String S1 = "...";
// 是否安全?
final String S2 = "...";
// 是否安全?
Date D1 = new Date();
// 是否安全?
final Date D2 = new Date();
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// 使用上述变量
}
}
Servlet运行在Tomcat环境下,只有一个实例,Servlet会被Tomcat的多个线程共享使用。
因此内部的成员变量都会存在共享问题。
HashMap是线程不安全的集合,可使用ConcurrentHashMap。
String是不可变类,final,private修饰符防止内部行为被子类覆盖,内部属性不可修改,线程安全的。
replace,substring修改String内部值是如何保证线程安全的呢?创建新字符串。
Date是可变类型,是Servlet中的成员变量,被创建一份属于共享资源,线程不安全的。
加上final修饰符只能保证成员变量D2的引用值被固定,但日期中其他属性(年月日)可变,所以线程不安全。
案例二
public class MyServlet extends HttpServlet {
// 是否安全?
private UserService userService = new UserServiceImpl();
public void doGet(HttpServletRequest request, HttpServletResponse response) {
userService.update(...);
}
}
public class UserServiceImpl implements UserService