0

やあみんな、
私はこれらのいわゆるノンブロッキングテクニックを読んでいますが、疑問はほとんどありません:

1)ロックフリー操作はアトミック操作を使用して実行されますが、これらのアトミック操作とは何ですか?つまり、特定のレベルでは、ロック権も必要ですか? それで、このロックフリーのアプローチは、より細かい粒度でのみロックを提供しますか?
2) 彼らはノンブロッキング リストと言っています。ノンブロッキング リストとはどうあるべきか : 複数のスレッドが同じ挿入で来る場合、1 つだけが成功し、別のスレッドは他の作業を正しく行いますか?他のスレッドには、ノードを挿入する以外に選択肢がないのに、どうしてノンブロッキングなのですか? 前のものが完了するまでブロックされませんか??
3) Java では、どのようにアトミック操作を行うのですか? 彼らは次のようなことをしませんか synchronized boolean ..... 彼らはロックを取得しているので、ロックフリー、つまり同期セクションはどうですか?4) CAS は通常、アトミック操作の実装に使用されます。cas は、同じオブジェクトに対して 1 つの操作のみを許可し、同じオブジェクトに対して他の操作を停止 (ブロック) するのではないでしょうか? 疑問が多くて申し訳ありません...明確にしてください...

編集 更新する構造があるとどうなりますか? ハードウェアでもサポートされていますか? そうではありません。言語は、これらの構造操作をアトミックにするために、あるレベルでロックを取得しているのではないでしょうか? JAVA
について:オブジェクト(構造またはあらゆる種類のオブジェクト)の更新を提供するAtomicReferenceおよびAtomicReferenceFieldUpdaterクラスがあるため、パフォーマンス、つまり速度の観点からそれらを比較できますか?両方の in tern は、Native クラスを使用する Unsafe クラスを使用します。

4

2 に答える 2

8

これがAtomicIntegerの簡単なロックフリーメソッドです

public final int getAndIncrement() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}

値を取得してインクリメントし、compareAndSwapを実行することがわかります。compareAndSwapが期待値を見つけられない場合は、別のスレッドが値を変更したことを意味します。したがって、値を変更しようとしている他のすべてのスレッドがそうするまで、何度も何度も試行します。これは、ロックが使用されていないためロックフリーですが、複数回(非常にまれ)再試行する必要がある場合があるため、ブロックフリーではありません(非常にまれです)。


1)ロックフリー操作はアトミック操作を使用して実行されますが、これらのアトミック操作とは何ですか?つまり、特定のレベルでは、ロック権も必要ですか?それで、このロックフリーのアプローチは、より細かい粒度でのみロックを提供しますか?

ただし、ロックはより基本的な操作を使用して実装されます。それ以外の場合は、ロックアドナセウムを実装するためにロックが必要になります。ロックフリーアプローチは、本格的なロックを回避する不可分操作を使用します。

2)彼らは非ブロッキングリストを言います、今、非ブロッキングリストはどうあるべきですか:複数のスレッドが同じ挿入に来る場合、1つだけが成功し、別のスレッドは他の仕事を正しく行いますか?、

スレッドセーフであれば、両方とも一度に1つずつ成功するはずです。

しかし、他のスレッドがノードを挿入する以外に選択肢がない場合、どうしてそれが非ブロッキングになるのでしょうか?

この用語は「同時」です。それでも、他のスレッドが終了するのを待つ必要があります。これを行うには、ロックフリーのアプローチを使用します。

前のものが完了するまでブロックされませんか?

はい。

3)Javaでは、どのようにアトミック操作を行いますか?

アトミック操作を実行する呼び出しネイティブメソッドがあります。これは、コードを読むことで確認できます。;)生成されたネイティブコードを見ると、これらのネイティブメソッドは、(真のメソッド呼び出しではなく)パフォーマンスのためにマシンコード命令に変換されます。

彼らは同期ブール値のようなことをしませんか.....それで、彼らはロック、すなわち同期セクションを取得しているので、どのようにロックフリーですか?

いいえ、コードを読むと、そうではないことがわかります。

4)CASは通常、アトミック操作を実装するために使用されます。したがって、同じオブジェクトで1つの操作のみを実行することはできません。

いいえ。

同じオブジェクトを操作したい他の人を停止(ブロック)しますか?

いいえ。

繰り返しになりますが、それがどのように使用されているかを見ると、より理にかなっているかもしれません。

于 2011-05-13T12:39:50.757 に答える
2

1)ロックフリー操作はアトミック操作を使用して実行されますが、これらのアトミック操作とは何ですか?

たとえば、カウンターのインクリメントには以下が含まれます

  1. 現在の値を読み取り、
  2. メモリ内の値をインクリメントし、
  3. 更新された値を書き戻します。

原子性とは、これらすべてが 1 つの中断不可能な変更として発生することを意味します。

つまり、特定のレベルでは、ロック権も必要ですか?

違う。CAS の背後にある基本的な考え方は、上記の最初の 2 つの手順を実行してから、3 番目の手順の前に値が変更されたかどうかを確認し、変更された場合は失敗することです。その後、後で新しい値を使用して変更を再試行できます。

3 つのステップ自体はアトミックであるため、従来のロックは必要ありません。3 番目の (Compare And Swap) 操作は最新のプロセッサでサポートされているため、レジスタ レベルで何らかのロックが必要であると言うかもしれません (率直に言って、どのように実装されているかはわかりません)。これは、Java でのロックの一般的な意味とは異なります。

CAS の利点はパフォーマンスの向上です。これは、現在の JVM のロック パフォーマンスが改善されたとしても、特に競合の場合 (つまり、操作で複数のスレッドが衝突する場合) には CAS の方が安価であるためです。この場合、ロックを使用して 1 つ以上のスレッドが中断され、代わりに新しいスレッドがコンテキストに持ち込まれます。これは、メモリのスワップを伴わない場合でも、非常にコストのかかる操作です。

2) 彼らはノンブロッキング リストと言っていますが、ノンブロッキング リストはどうあるべきか

ここでは、2 つの異なる用語を混同している可能性があります。非ブロッキング リストは、挿入/削除時にブロックされないリストです。これは、通常、そのサイズが制限されていないことを意味します (例: CopyOnWriteArrayList)。これを、最大サイズが固定されているブロッキング キュー(例: ArrayBlockingQueue) と比較してください。サイズ制限に達すると、(他のスレッドがキューから要素を削除した後) より多くのスペースが使用可能になるまで、追加の挿入呼び出しがブロックされます。

ロックフリー アルゴリズム ( などConcurrentHashMap) を使用してスレッド セーフを実現するコレクションは、非ブロッキング コレクションとは異なります。

于 2011-05-13T12:17:28.560 に答える