8

次の 2 つのカウンターの実装があるとします。

class Counter {
  private final AtomicInteger atomic = new AtomicInteger(0);
  private int i = 0;

  public void incrementAtomic() {
    atomic.incrementAndGet();
  }

  public synchronized void increment() {
    i++;
  }
}

一見したところ、アトミックはより高速でスケーラブルなはずです。そして、彼らはそうだと私は信じています。しかし、それらはsynchronized常にブロックよりも高速ですか? または、このルールが破られた場合 (例: SMP/シングル CPU マシン、異なる CPU ISA、OS など) が存在しますか?

4

5 に答える 5

5

incrementAndGetCAS ループとして実装することもできます。n個のスレッドに対して、 n -1 個のスレッドが失敗し、O( n ) 問題が発生する可能性がある非常に満足のいく状況では。

( @Geek の場合:

通常getAndIncrement、次のように実装できます。

 int old;
 do {
     old = value;
 } while (!compareAndSet(value, old, old+1));
 return old;

同じアトミックでこのコードを実行するn 個のスレッドがあり、たまたま互いに歩調を合わせていると想像してください。最初の反復はknの作業を行います。1 つの CAS だけが成功します。残りのn -1 スレッドは、1 つだけになるまで演習を繰り返します。したがって、総作業量は O( n ) ではなく O( n ^ 2) (最悪の場合) になります。)

そうは言っても、ロックを取得するには、せいぜい似たようなことをする必要があり、激しい競合が発生した場合、ロックは最高の状態ではありません。get および compareAndSwap の前に大量の計算を必要とする CAS ループを使用するまで、ロックの利点があまり見られない可能性があります。

于 2012-07-19T00:48:30.167 に答える
3

または、このルールが破られた場合 (例: SMP/シングル CPU マシン、異なる CPU ISA、OS など) が存在しますか?

私は何も知りません。(そして、誰かが具体的な反例を知っていれば、修正する準備ができています。)

ただし(これが私の主なポイントです)、タイプと同じかそれよりも高速なハードウェアアーキテクチャまたは実装が不十分なJVMを使用できないという理論的な理由はありません。(これら 2 つの形式の同期の相対速度は実装の問題であり、既存の実装についてのみ定量化できます。)synchronizedatomic

もちろん、これは絶対に を使用してはならないという意味ではありませんsynchronizedsynchronized構成体には、アトミック クラスが対応していない多くのユース ケースがあります。

于 2012-07-19T00:00:34.167 に答える
2

これは実装に依存するため、最終的には特定のプラットフォーム/JVM/構成でベンチマークする必要があります。

そうは言っても、次の理由により、アトミックは常に高速である必要があります。

  • アトミックは、JVM がアトミック マシン命令を利用できるように設計されています。アトミック マシン命令は、ほとんどのプラットフォームで取得できる最速のアトミック操作です。
  • synchronizedは、潜在的に大きなコード ブロックを保護するように設計された、モニター オブジェクトで比較的重いロック スキームを使用します。この形式のロックは、本質的にアトミック操作よりも複雑であるため、ランタイム コストが高くなると予想されます。
于 2012-07-19T00:30:53.303 に答える
0

他の人が言ったように、これは実装依存です。ただし、プログラムの不変条件に複数の変数が含まれている場合は、同期を使用してそれらをまとめて更新する必要があることに注意してください。アトミック型であるという理由だけで、関連する 2 つの変数に対してアトミック操作を一緒に実行することはできません。その場合、唯一の友達が同期されます。

于 2012-07-19T07:55:11.340 に答える
-3

アトミック変数は常に高速になります。

java.util.concurrent パッケージでは、同期ブロックではなく、常にアトミック変数が使用されていることがわかります。

于 2012-07-18T23:57:11.483 に答える