2016-11-01 12 views
1

AtomicIntegerは同期プリミティブと見なされますか、それともJava(wait()、notify()などによって提供されるメソッドです)。AtomicInteger同期プリミティブはありますか?

原子整数はintで操作でき、ロックフリースレッドセージプログラミングを提供するので、私はプリミティブの定義について混乱します。同期を使用しないでください。

+0

AtomicIntegerはプリミティブではありません。 – DejaVuSansMono

+0

票がありません。重複:[同期プリミティブの定義](http://stackoverflow.com/questions/8017507/definition-of-synchronization-primitive) –

+0

@DejaVuSansMono私はそれを読んだが、それは私には明らかではなかった。特に(通常、アトミック操作、メモリバリア、スピンロック、コンテキストスイッチなど)を使用して構築されています。これは、アトミック操作を使用して構築できることを示しています。 – 3rdeye7

答えて

3

AtomicIntegerはクラスです。そのメソッドは...まあ、メソッドです。それらのどちらも同期の原型とは見なされません。

incrementAndGetとその他の方法でも使用されているcompareAndSetメソッドは、Unsafe.compareAndSwapInt(OpenJDK 7では便利です)を使用しています。これはネイティブメソッド—なので、プリミティブとも言えるでしょう。実際、現代のCPUでは、CAS命令に変換されるため、ハードウェアレベルまでのプリミティブです。

クラスはまた、同期プリミティブでもあるvolatileのメモリの可視性に依存しています。

+0

乱数ジェネレータの場合、ほとんどの場合、整数の整数とシードをシンクロを使用せずに使用する多くの例を読んでいます。これらは実際には同期プリミティブを使用していないため、原子プリミティブを使用していますか? – 3rdeye7

+0

"同期"自体は過負荷状態です。キーワードには 'synchronized'(関連するセマンティクス)があり、アクションを同期させるというコンセプトがあります。これはより抽象的なコンセプトであり、' volatile'キーワードのようなものがあります。例えば、JLS 17.4.4では、後者の意味での「同期順序」について述べています。だから、そのフォローアップの質問さえ少し曖昧です。 – yshavit

2

私はこの質問が少し曖昧だと思います。しかし、私は "言語プリミティブ"は通常、言語のコアの一部である言語要素を指していると思います。

つまり、キーワードとそれに関連するセマンティクス。その意味で、 (その2つの意味)とvolatileキーワードがマルチスレッドに関する唯一の「プリミティブ」であると表示されます。

もちろん、Object;したがって、wait()、notify()などのすべてのメソッドは、Javaの本質的な部分です(最初は避けることはできません)。もちろん、Threadクラスについても同じことが言えます。

短い説明:の言語キーワードとして存在するコンセプトを区別することができます(したがって、コンパイラによって処理されます)。 「通常の」クラスとなる「オン・トップ」の概念です。そして、yshavitの答えがうまく説明されているように、AtomicIntegerの特定の側面を物の「ネイティブ」側に直接マッピングすることができます。つまり、「プリミティブ」という用語は、Javaマルチスレッドのトピックに関する記述/差別化の概念にはあまり役立たないということです。あなたの最初のクエリについて

1

は、同期プリミティブと考えAtomicIntegersされるか、あるいはそれが(ETC(通知)(待つ)、)は、Javaが提供するだけの方法です。

いいえAtomicIntegerは、メソッドでも同期プリミティブでもありません。

AtomicIntegerはメソッドを持つクラスです。 atomic packagesを参照してください

単一変数でロックフリーのスレッドセーフなプログラミングをサポートする小さなツールキットです。本質的には、このパッケージのクラスは、フォームの原子条件付き更新操作を提供するものと揮発性の値、フィールド、および配列要素の概念を拡張:

boolean compareAndSet(expectedValue, updateValue); 

このパッケージのクラスも含まれ取得する方法と、あなたの2番目の問合せに関しては無条件に設定された値だけでなく、弱い条件付き原子更新操作weakCompareAndSet

私はPRIの定義について混乱しています原子整数として動作することができ、ロックフリースレッドセージプログラミングを提供することができます。同期を使用しないでください。

つのキーノート:

​​の範囲がAtomicIntegerまたはAtomicXXX変数に比べて本質的に広いです。​​のメソッドまたはブロックを使用すると、多くのステートメントを含む重要なコードセクションを保護できます。

compareAndSetメソッドは、一般的なロックの置換ではありません。これは、オブジェクトの重要な更新が単一の変数に限定されている場合にのみ適用されます。

アトミッククラスは、java.lang.Integerおよび関連クラスの一般的な置き換えではありません。ただし、AtomicIntegerNumberまで拡張されており、数値ベースのクラスを扱うツールやユーティリティによって一様にアクセスできます。

+0

java.util.conncurentのCountdownLatchはどうですか?この記事で提案されている同期プリミティブは正しいですか?[link](http://stefan.kapferer.ch/2015/08/14/parallel-programming-summary1/#specific-synchronization-primitives)? – 3rdeye7

関連する問題