私は異なる変数を持つモデルを持っています。私はモデルが作成され、サーバの起動時にスレッドの安全な方法でHashMapの値をインクリメントせずに、高性能を維持しながらインクリメントしますか?
public class Model implements Serializable{
public final static int STATE_INIT = 0;
public final static int STATE_READY = 1;
private Integer state = STATE_INIT;
private HashMap<Integer,Integer>pageRequests = new HashMap<>();
private HashMap<Integer,Integer>impr = new HashMap<>();
private HashMap<Integer,Integer>clicks = new HashMap<>();
public void incrementPageRequests(int accountId){
if(this.pageRequests.get(accountId) != null){
this.pageRequests.put(accountId,this.pageRequests.get(accountId) +1);
} else {
this.pageRequests.put(accountId,1);
}
}
public void incrementImprServed(int accountId){
if(this.imprServed.get(accountId) != null){
this.imprServed.put(accountId,this.imprServed.get(accountId) +1);
} else {
this.imprServed.put(accountId,1);
}
}
public void incrementClicksServed(int accountId){
if(this.clicksServed.get(accountId) != null){
this.clicksServed.put(accountId,this.clicksServed.get(accountId) +1);
} else {
this.clicksServed.put(accountId,1);
}
}
}
は、今ではシングルトンBeanです。私はいくつかのいずれかがエンドポイントを呼び出すとき
/増分に
@GetMapping(path = "/increment")
public String increment(){
model.incrementPageRequests(1);
return "Okay";
}
をモデルのハッシュマップを変更することができるようにしたい私は、メソッドがスレッドセーフになっキーワードを追加する際に現在このincrementPageRequestはスレッドセーフではありませんしかし、同期は非常にコストがかかり、高いスループットとパフォーマンスを求めていると聞いています。
どのように同期させずに高性能を維持することができますか?
更新
が同時のHashMapで試しても、それは私はそれが同時ハッシュマップに
if(this.pageRequests.get(accountId) != null){
this.pageRequests.put(accountId,this.pageRequests.get(accountId) +1);
} else {
System.out.println("Here");
this.pageRequests.putIfAbsent(accountId,1);
}
を動作するように私はこのロジックを変更するにはどうすればよいのAPI
への同時通話をテストするためのJMeterを使用しています失敗
同期は非常に高価です。それがボトルネックになると思うなら、いくつかの証拠を得る必要があります。 'ConcurrentHashMap'はあなたがバグをコードしていない限り、失敗しません。あなたが何を求めているのか不明です。 – EJP
あなたは 'synchronized'がこのREST呼び出しの* slow *セクションになると思いますか?本当に? – Nim
私はそれについてはわかりませんbutiはハッシュマップを同時ハッシュマップに変更しようとしましたが、動作しません。あなたは私の方法で変更する必要があることを私に許してもらえますか? @EJP – INFOSYS