Случай 1, ваш сервлет использует некоторый код, который обращается к базе данных. Базы данных имеют механизмы блокировки, которые вы должны использовать. Для этого есть две важные причины: сама база данных может быть использована другими приложениями, которые читают и записывают эти данные; вашему приложению недостаточно для борьбы с самим собой. И еще: ваше собственное приложение может быть развернуто в масштабированном кластерном веб-контейнере, где несколько копий вашего кода выполняются на разных компьютерах.
Итак, существует множество стандартных шаблонов для работы с блокировками в базах данных, вам, возможно, придется ознакомиться с пессимистической и оптимистической блокировкой.
Пул соединений API и сервлетов JBC дает вам некоторые полезные гарантии, так что вы можете написать свой код сервлета без использования синхронизации Java, если ваши переменные находятся в области действия метода, в принципе у вас есть
Start transaction (perhaps implicit, perhaps on entry to an ejb)
Get connection to DB ( Gets you a connection from pool, associated with your tran)
read/write/update code
Close connection (actually keeps it for your thread until your transaction commits)
Commit (again maybe implictly)
Таким образом, ваша единственная реальная проблема - иметь дело с любыми конфликтами в БД. Все вышеперечисленное имеет тенденцию быть более приятным, используя такие вещи, как JPA в наши дни, но под прикрытием это более или менее то, что происходит.
Случай 2: статический метод, это, вероятно, подразумевает, что теперь вы храните все в структуре памяти. Это (за исключением какого-либо удаленного вызова) подразумевает одну JVM, и вы сами управляете блокировкой. В случае сбоя вашей JVM или машины, я думаю, вы потеряете свои данные. Если вы заботитесь о своих данных, то лучше использовать БД.
ИЛИ, как насчет совершенно другого подхода: сервлет просто записывает «голос», записывая сообщение в постоянную очередь JMS. Пусть некоторые другие процессы заберут голоса из очереди и сложат их. Вы не дадите немедленную обратную связь избирателю таким образом, но вы отделите опыт пользователя от реальной (в подобных сценариях) довольно сложной обработки.