私たちのコードの多くは残念ですが、私たちは "Big Data"バックエンドに移行しており、新しいAPI呼び出しを伝えようとしています。最新のSpringライブラリの使用を奨励しています。レイヤーIDの生成。私が理解できない理由のために、より高い権限がシーケンシャルBigInteger'sを望んでいます。私はそれらを無作為にして再生成し、失敗した挿入を再試行しただろうが、私は拒否された。安全にBigIntegerをスレッドセーフな方法でインクリメントできます。おそらくAtomicReference、w/o lockingを使用していますか?
私は増分してスレッド間でBigIntegerを取得し、安全かつ効率的な方法でそれを行う必要がある位置にいます。これまでAtomicReferenceを使ったことはありませんでしたが、このアプリケーションにはかなり近いと思われます。今私たちはコードブロックを同期させているので、パフォーマンスがかなり悪くなります。
これは正しい方法ですか?構文例?
このモジュールの仕組みは、ストアドプロシージャを使用してデータベースにヒットし、使用する値の範囲を取得します。一度に20万人に1回しか起こらないように、一度に数十万人。これにより、さまざまなサーバーが互いを踏み出すことなく、BigIntegerを任意の後続の値に設定しなければならないというしわが加わります。もちろん、スレッドセーフである必要もあります。
P.S.私はまだ私のランダム世代のアイデアは、このすべてのスレッドのものを処理するよりも良いと思う。 BigIntegerは非常に多く、同じものを2回生成する確率はゼロに近い必要があります。
public final class AtomicBigInteger {
private final AtomicReference<BigInteger> valueHolder = new AtomicReference<>();
public AtomicBigInteger(BigInteger bigInteger) {
valueHolder.set(bigInteger);
}
public BigInteger incrementAndGet() {
for (; ;) {
BigInteger current = valueHolder.get();
BigInteger next = current.add(BigInteger.ONE);
if (valueHolder.compareAndSet(current, next)) {
return next;
}
}
}
}
それは基本的にincrementAndGet()
「AtomicReference」のように思われませんロックしないであなたのためです。しかし、longより大きい整数が必要な場合を除いて、BigIntegerがあなたの速度を落とさないなら、私は驚くでしょう。 AtomicLongに行くように彼らに説得してみてください。 –
私はそれを調べます。いずれにせよ、私はまだ専門的にはその答えが不思議です。 ;-)特に私が再び拒否するかもしれないから。政治。 – user447607
AtomicReference(他のAtomicクラスと同様)はロックを使用しません。 – bowmore