Ниже приведен пример класса (измененный с того, который я тестировал), я хотел бы знать, является ли это потокобезопасным классом.Переменная экземпляра и безопасность потока в java
Я вижу другие сообщения и блоги, на которых ответили, что переменные экземпляра не обязательно являются потокобезопасными. (большинство примеров, показанных с помощью примитивных типов)
Когда я создаю объект OutputResponse вне метода и загружаю его с soapui, он терпел неудачу, но когда я создаю объект внутри метода, тест нагрузки всегда преуспел.
@Service
public class ExampleProvider {
private OutputResponse outputResponse;
@Post
@Path("/test")
@Consumes("application/json")
@Produces("application/json")
public OutputResponseEntity execute (InputRequest inputRequest) {
outputResponse = new OutputResponse();
outputResponse.setSomeValue("this is test");
populateOutputResponse();
}
private OutoutResponseEntity<OutputResponse> populateOutputResponse() {
if(null != inputRequest) {
outputResponse.setSomeOtherValue(inputRequest.getName());
}
return new OutputResponseEntity(outputResponse,httpstatus.OK);
}
}
Какие рамки вы используете для '@ Service' и остальных этих аннотаций? – markspace
Нет, это не потокобезопасно. У вас есть личные данные, которые изменяются. Это определение «небезопасно». Удалите элемент частных данных и сделайте OutputResponse локальным для метода. Это потокобезопасность. – duffymo
@duffymo Я ожидал того же, создав переменную OutputResponse локально внутри метода, является потокобезопасной и сохраняя ее как переменную экземпляра «не потокобезопасной», но тесты нагрузки успешно выполняются в обоих случаях всегда. Протестировано с двумя потоками, начальное количество потоков - 20 и конец потока подсчитывается как 2 в soapui .. – jagan