Да, у вас будет проблема с синхронизацией.
Предположим, у вас есть один сервлет:
public class FooServlet extends HttpServlet {
private MyBean myBean;
public void init() {
myBean = (MyBean) WebApplicationContextUtils.
getRequiredWebApplicationContext(getServletContext()).getBean("myBean");
}
public void doGet(HttpRequest request, HttpResponse response) {
String string = myBean.get();
....
}
}
class MyBean {
public String get() {
if (service == null) {
// try and load the service again
}
// perform operation on the service is service is not null
}
}
И ваше определение бина выглядит так:
<bean id="myBean" class="com.foo.MyBean" init-method="initialise" />
Проблема в том, что ваш экземпляр сервлета используется несколькими потоками запросов. Следовательно, кодовый блок, защищенный service == null, может быть введен несколькими потоками.
Лучшее исправление (избегая двойной проверки блокировки и т. Д.):
class MyBean {
public synchronized String get() {
if (service == null) {
// try and load the service again
}
// perform operation on the service is service is not null
}
}
Надеюсь, это имеет смысл. Оставьте комментарий, если нет.