スプリングレストコントローラーによって呼び出されているシングルトンスプリングサービスがあります。
シングルトン サービスには、次の実装を持つMyService
メソッドがあります。addRecordIfNotExistsBefore
public void addRecordIfNotExistsBefore(String record){
boolean isExist = checkIfRecordNotExitsBefore();
if (!isExist){
addRecordToDb(record);
}
}
問題は、明らかなように、2 つのクライアントが同時に同じサービスを要求すると、レコードがデータベースに 2 回追加されることです。
次のような簡単な実装で、ダブルチェックのイディオムを適用できます。
public void addRecordIfNotExistsBefore(String record){
boolean isExist = checkIfRecordNotExitsBefore();
if (!isExist){
synchoronized(this){
isExist = checkIfRecordNotExitsBefore();
if (!isExist){
addRecordToDb(record);
}
}
}
}
それは有効な解決策ですか、それとも別のより良い解決策がありますか?