Являются ли контроллеры Spring потокобезопасными

Я наткнулся на этот пример контроллера, и мне интересно, является ли он потокобезопасным? Меня интересует именно переменная экземпляра gson.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class TestController {

    private final Gson gson = new Gson();

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public void test(HttpServletResponse res, HttpServletRequest req) throws IOException {
        HashMap<String, String> hm = new HashMap();
        res.getWriter().print(gson.toJson(results));
        res.getWriter().close();
    }
}

person EdgeCase    schedule 03.01.2013    source источник
comment
связанный заголовок stackoverflow.com/questions/10380835/   -  person Boris Treukhov    schedule 03.01.2013


Ответы (4)


Чтобы ответить на вопрос в заголовке «Являются ли контроллеры Spring потокобезопасными», контроллеры Spring являются синглтонами, поэтому они ДОЛЖНЫ быть реализованы потокобезопасным способом, но вы должны убедиться, что ваша реализация ДЕЙСТВИТЕЛЬНО потокобезопасна.

В коде, который вы публикуете, все должно быть в порядке, поскольку, как указывали другие, GSON является потокобезопасным.

person digitaljoel    schedule 03.01.2013
comment
Предположим, что все правила потокобезопасности для сервлета применимы и к контроллеру Spring, верно ли понимание? - person soufrk; 28.04.2017

Предполагая, что этот контроллер создан как обычный bean-компонент Spring "singleton", ответ будет нет.

Вы можете создать контроллер как prototype, и в этом случае для каждого запроса будет создаваться новый экземпляр. Лучшей идеей, если вы хотите это сделать, является определение области действия вашего компонента как request.

Тем не менее, я сомневаюсь, почему любой объект контроллера имеет переменные-члены, помимо возможности неправильного определения области действия bean-компонента. Это указывает на то, что контроллер пытается выполнить слишком много работы и что часть этой работы следует переложить на службу или вспомогательный класс. Единственное, что должен делать контроллер MVC, — это передавать данные запроса на уровень службы и извлекать данные для отображения в представлении.

person parsifal    schedule 03.01.2013
comment
@Boris - достаточно подробно? Я чувствовал, что важно помешать ОП сделать что-то глупое, прежде чем предлагать альтернативы. - person parsifal; 03.01.2013
comment
ОП достаточно ясно заявил, что вопрос касается безопасности потоков экземпляра GSON I am wondering specifically about the gson instance variable.. - person Boris Treukhov; 03.01.2013
comment
@Борис, хорошо. Но мне интересно, почему он / она не придумал заголовок, например, Является ли Gson потокобезопасным? - person parsifal; 03.01.2013
comment
Задать вопрос сложно, выбрать правильный заголовок сложно. P.S. создание объекта, ограниченного потоком (изменение области также не делает объект автоматически ограниченным потоком), НЕ делает его класс потокобезопасным. - person Boris Treukhov; 03.01.2013

Gson определенно является потокобезопасным и был сделан таким еще в 2008 году, поэтому, пока ваша версия опубликована, все должно быть в порядке. Я не вижу проблем с безопасностью потоков в вашем коде. Хотя я бы сделал экземпляр Gson статическим.

person ramsinb    schedule 03.01.2013
comment
Gson может быть потокобезопасным, но помещать переменные-члены в контроллеры — плохая привычка. - person parsifal; 03.01.2013
comment
Это действительно зависит, например. Обычно вы видите, что такие вещи, как реализация службы, вводятся как переменная-член... Однако с Gson я бы специально сделал его статическим, просто из принципа. - person ramsinb; 03.01.2013
comment
Избегать использования переменных-членов — это как ездить на трехколесном велосипеде, боясь упасть, вместо того, чтобы учиться ездить и соблюдать правила дорожного движения — вы не упадете, но это не должно давать вам ложного чувства безопасности. - person Boris Treukhov; 05.01.2013

Точно так же, как методы обработчика запросов контроллера сервлетов, также не являются потокобезопасными. Т.е. множественный запрос к /test может привести к выполнению тестового метода многими потоками.

В вашем примере вам не нужно беспокоиться о безопасности потоков, поскольку gson.toJson(results) - единственная операция над gson, и похоже, что она не изменит состояние этого объекта.

person Subin Sebastian    schedule 03.01.2013