Политика создания экземпляров для сервлетов не определена в спецификации сервлета (насколько я помню, в любом случае), но обычное поведение, по-видимому, заключается в создании только одного экземпляра на конфигурацию сервлета.Таким образом, в вашем случае каждый запрос будет использовать одну и ту же переменную.
На вашем месте я бы посоветовал отправить jobId в качестве параметра тем Runnable
, с которыми вы запускаете потоки.Например, вместо этого:
public class HelloWorld extends HttpServlet {
private static long jobId;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
jobId = Long.parseLong(request.getParameter("jobid");
new Thread(new Worker()).start();
}
static class Worker implements Runnable {
@Override
public void run() {
doSomethingWith(jobId);
}
}
}
Рефакторинг статических переменных, таких как:
public class HelloWorld extends HttpServlet {
// private static long jobId; -- delete, no longer needed
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
long jobId = Long.parseLong(request.getParameter("jobid"); // local variable
new Thread(new Worker(jobId)).start(); // send jobId as parameter
}
static class Worker implements Runnable {
private final long jobId; // non-static; every instance has one
public Worker(long jobId) { // allow injection of jobId
this.jobId = jobId;
}
@Override
public void run() {
doSomethingWith(jobId); // use instance variable instead of static
}
}
}
Легче читать, нет проблем с параллелизмом - чистый выигрыш.