Che*_*Che 8 java static multithreading servlets
我正在开发一个java servlet,在运行时,在新线程中启动不同的对象方法.这些线程应该访问描述特定servlet实例的变量,比如jobId.出于这个原因,我将jobId变量声明为static.servlet构造函数正在为每个servlet实例(调用)计算此值.如果servlet同时被调用几次,我就会徘徊,静态jobId变量在调用之间共享,这意味着一些线程将获得错误的jobId,或者每次调用都计算一次 - 所以线程是启动的特定servlet将使用为此特定servlet计算的jobId(这是我希望它工作的方式).有任何想法吗?非常感谢!
Bal*_*usC 29
servlet只在webapp启动时创建一次,并在所有请求之间共享.静态与否,每个类/实例变量将在所有请求/会话之间共享.您不希望将请求/会话范围数据分配给它们.而是声明/将它们指定为方法本地变量.例如
public class MyServlet extends HttpServlet {
private static Object thisIsNotThreadsafe;
private Object thisIsAlsoNotThreadsafe;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadsafe;
thisIsNotThreadsafe = request.getParameter("foo"); // BAD! Shared among all requests.
thisIsAlsoNotThreadsafe = request.getParameter("foo"); // BAD! Shared among all requests.
thisIsThreadsafe = request.getParameter("foo"); // Good.
}
}
Run Code Online (Sandbox Code Playgroud)
存在遗留和已弃用的 SingleThreadModel接口,您可以让servlet在每个请求期间强制创建.但这是一个糟糕的设计,并且不必要地昂贵.这也是它被弃用的原因.
static意味着每个实例都将访问相同的值。
因此连接到 servlet 的每个用户都将访问相同的值。当 2 个或更多用户连接在一起时,您的 jobId 可能会错误。
您必须为每个连接获取自己的值并将其存储在其他地方。
资源 :
关于同一主题:
| 归档时间: |
|
| 查看次数: |
24838 次 |
| 最近记录: |