以下はサンプルクラスです(これは私がテストしたものです)。これはスレッドセーフなクラスかどうかを知りたいと思います。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変数をローカルに作成するのは、スレッドセーフであり、インスタンス変数として「スレッドセーフではありません」としていますが、ロードテストは常に成功します。 soapuiで2と終了スレッド数をカウントします。 – jagan