2017-11-30 19 views
0

私は2つのクラスとguavaキャッシュオブジェクトを含む3つ目のシングルトンクラスを持っています。クラスAでこのキャッシュを使用してget(key)とインクリメントを実行し、呼び出されたときにインクリメントし、3000 /分の速度で呼び出します。 get(key)を使用してこの値をdbに追加し、キーに対して0を入れるクラスBがあります。 AとBの両方が同じ値を一度に読み取ると、問題につながる可能性があります。 たとえば、keyの値が12で、両方の読みが12、Bが0に設定されている場合、Aは再び13に設定します。 何をすべきかをお勧めします。 B.マップビューのA用guavaキャッシュのような更新機能の選択が必要

+0

クラスBは、15分間隔で呼び出され、追加されます。 –

答えて

1

使用

cache.asMap().compute(key, (k, v) -> v==null ? 1 : v+1) 

int[] result = {0}; 
cache.asMap().computeIfPresent(key, (k, v) -> { 
    result[0] = v; 
    return 0; // or null if you want to remove the entry 
}); 

キー上のコンピューティングをロックConcurrentMap、です。

おそらくキャッシュは一切必要ありません。 ConcurrentHashMapAtomicLongMap、または(Xaerxessと記されている)ConcurrentHashMultisetを使用することを検討してください(おそらくマルチセットは数えられるので、最後の選択肢はおそらく最高です)。

+1

OPにキャッシュが必要ないと私は同意します。['ConcurrentHashMultiset'](https://google.github.io/guava/releases/23.0/api/docs/com/google/common/collect/)もお勧めします。これはクラスBが行う場合(すなわち、それを "キャッシュ"から取り除く)であれば、箱から取り出してゼロの値を扱うからです。 – Xaerxess

関連する問題