下面是一個示例類(從我測試的那個中修改),我想知道這是否是線程安全類。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並且在soapui中結束線程數爲2 .. – jagan