我对线程相当新,我已经阅读了很多关于堆栈溢出的Q / A,现在已经有一周了。 我有一个问题,我无法找到答案。我希望你能帮助我。以下是示例代码:
public class servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
HashMap<String,String> map = null;
... // add some entries to the hash map
ArrayList<String> info = Toolbox.extractInformation(map);
// 1. use the info to generate the response to the client
// 2. Send response to the client
// <End>
}
}
public class servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
HashMap<String,String> map = null;
... // add some entries to the hash map
ArrayList<String> info = Toolbox.extractInformation(map);
// 1. use the info to generate the response to the client
// 2. Send response to the client
// <End>
}
}
public class Toolbox {
public static ArrayList<String> extractInformation(HashMap<String,String> map) {
...
}
}
在当前场景中,我有两个(或更多)Servlet,它们都使用一个没有任何同步的常见Toolbox方法。
据我所知,这应该是线程安全的,因为每个线程将在它自己的堆栈中创建方法和方法参数的副本并独立执行。
Toolbox方法不使用实例变量,只使用传递的参数。它操纵参数并返回另一个对象,在本例中为ArrayList
知道容器可能在同一个servlet实例上执行多个线程
我的问题是:
感谢您的帮助
由于
答案 0 :(得分:1)
你的直觉是正确的 - 这里确实存在基于线程问题的机会:
HashMap<String,String> map = null;
... // add some entries to the hash map
ArrayList<String> info = Toolbox.extractInformation(map);
如果你的意思是:
HashMap<String,Object> map = new HashMap<String,Object>();
... // add some entries to the hash map
ArrayList<String> info = Toolbox.extractInformation(map);
在这种情况下,只要你不将同一个对象添加到两个中的地图... //将一些条目添加到哈希地图部分在这两个主题中,你很好。
static final Object anObject = new Object();
...
HashMap<String,Object> map = new HashMap<String,Object>();
// Share anObject in many threads.
map.put(anObject);
... // add some entries to the hash map
ArrayList<String> info = Toolbox.extractInformation(map);
但是 - 因为您使用的是String
:
HashMap<String,String> map = new HashMap<String,String>();
... // add some entries to the hash map
ArrayList<String> info = Toolbox.extractInformation(map);
除非在非常罕见的情况下,否则你应该避免线程问题。
答案 1 :(得分:0)
是的,你已经认出来了。重要的事实是Toolbox不会操纵任何共享状态。给予方法extractInformation()
的参数与任何其他局部变量一样,即仅在线程自己的地址空间中,而不是在主共享内存区域中。
顺便说一下,如果你处理请求或响应属性,那么你必须关心线程安全,即如果请求范围是SESSION或APPLICATION。