2015-11-30 2 views
0

Я чувствую, что это, вероятно, уже где-то ответили, но я не мог его найти или, возможно, не использовал правильные ключевые слова.Метод Threadsafe в сервлет-фильтре

Что я хочу сделать, это инициализировать значение в Servlet Filter с минимальной блокировкой. Я ни в коем случае не эксперт в области потоков, так вот что я придумал:

private static Object getObject() { 
    if(OBJECT == null) { 
     synchronized (MyClass.class) { 
      InputStream is = getInputStream("path_to_file"); 
      OBJECT = loadObject(is); 
     } 
    } 
    return OBJECT; 
} 

Этот метод используется в сервлет фильтр, который будет вызываться несколькими потоками одновременно. Я хочу убедиться, что я загружаю это, когда это необходимо, а не на метод init.

Мой вопрос в том, является ли эта тема безопасной? После инициализации я думаю, что это будет хорошо, но я хочу убедиться, что он работает, когда он инициализируется.

PS: Пожалуйста, перенаправить меня на любой вопрос, который уже отвечает на это, если они существуют. Благодаря!

+1

Почему бы не инициализировать его при запуске приложения? –

+0

Это была моя первая идея, но другими ограничениями в проекте я не могу этого сделать. Я знаю, что это плохо :) –

+0

@Rob Хорошо, ваш комментарий заставил меня понять, что проблема довольно глубже, чем я ожидал. Спасибо за вашу помощь –

ответ

0

Лучший подход заключается в использовании init метод:

Контейнер сервлетов вызывает метод инициализации ровно один раз после инстанцировании фильтра. Метод init должен выполнить успешно, прежде чем фильтр попросит выполнить любую фильтрацию .

http://docs.oracle.com/javaee/5/api/javax/servlet/Filter.html#init(javax.servlet.FilterConfig)

public void init(FilterConfig filterConfig) throws ServletException { 
    // read the file here, this method will be called only once 
}