私は非常に単純なWebサービスを持っているとしましょう。唯一のタスクは、そのエンドポイントが何回呼び出されたのかを数えることです。エンドポイントは/hello
です。メソッドの同時呼び出しを集計する
@Controller
public class HelloController {
private int calls = 0;
@RequestMapping("/hello")
public String hello() {
incrementCalls();
return "hello";
}
private void incrementCalls() {
calls++;
}
}
今は、この限り2人のユーザーが同時に、同じ時間に/hello
を呼び出さないように、すべて正常に動作します。しかし、/hello
への並列呼び出しが発生した場合、calls
変数は1回だけインクリメントされます(私が間違っていない場合)。だから明らかに何らかの種類の同期がここで行われる必要があります。
このメソッドをスレッドセーフにする最良の方法は何ですか?
'int'ではなく' java.util.concurrent.atomic.AtomicInteger'を使用してください。 – Jesper
コールのカウントにアトミックなlong型または整数型を追加しても問題ありません。さもなければ、コールカウント変数をロックで保護します。 –
関連:https://stackoverflow.com/questions/16795303/must-spring-mvc-classes-be-thread-safe – assylias