As Integerクラスも不変クラスであり、不変クラスがスレッドセーフであることがわかっているので、Atomic Integerが必要です。 私は混乱しています。 これは、不変オブジェクトの読み書きがアトミックである必要はないが、原子整数の読み書きはアトミックであるためです。 これは、原子クラスもスレッドセーフであることを意味します。JavaのAtomic IntegerとNormal immutable Integerクラスの違いは何ですか?
答えて
可変
int myInt = 3;
AtomicInteger
がmyInt
に関する検討します。
Integer
は、3
に関する。
つまり、変数は可変であり、値を変更することができます。値3は整数リテラル、定数、不変式です。
整数はリテラルのオブジェクト表現であり、したがって不変であるため、基本的には読み出すことができます。
AtomicIntegersは、これらの値のコンテナです。あなたはそれを読んで設定することができます。変数に値を代入するのと同じです。しかし、int
変数の値を変更することとは異なり、AtomicInteger
の操作はアトミックです。例えば、これは、原子
if(myInt == 3) {
myInt++;
}
ない
これは不変オブジェクトが定義して、スレッドセーフですが、変更可能なオブジェクトがあまりにもスレッドセーフすることができ、原子
AtomicInteger myInt = new AtomicInteger(3);
//atomic
myInt.compareAndSet(3, 4);
です。
これは、Atomic...
クラスの目的(AtomicInteger
、AtomicBoolean
、など)です。
さまざまな...get...
および...set...
のメソッドは、スレッドセーフなアクセスとオブジェクトの突然変異を許可します。
当然のことながら、クラスはjava.util.concurrent
パッケージで宣言されています。
あなただけjava.util.concurrent.atomic
パッケージのAPIを参照する必要があります。
単一の変数に対するロックフリーでスレッドセーフなプログラミングをサポートするクラスの小規模なツールキット。通常の整数はスレッドセーフではありませんが
のAtomicIntegerは、(実際には、は、java.util.concurrent.atomicパッケージからすべてのクラスはスレッドセーフです)、スレッドセーフです。
マルチスレッド環境でInteger変数を使用している場合(スレッドセーフにする)には、「同期」キーワード&が必要です'&' volatile 'キーワードは、スレッド整数型整数として扱われます。また
、私は同じ対象に、以下の役に立つチュートリアルをお勧めします: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html
通常のIntegerクラスはスレッドセーフでもありません – user18424
Normal Integerは、 'synchronized'および 'volatile'キーワードとともに使用する場合にのみスレッドセーフです。 – developer
@developer Integerは不変であり、したがってデフォルトではスレッドセーフであり、同期化または揮発性は必要ありません。しかし、不変性の欠点は、価値が決して変わることができないということです。値を変更する必要がある場合は、AtomicIntegerや他のメソッドやvolatile/synchronizedキーワードを使用してください。 – puhlen
のAtomicIntegerは、マルチスレッド環境で使用されます。 http://tutorials.jenkov.com/java-concurrency/compare-and-swap.html
「アトミック」パッケージの詳細については、Oracleのドキュメントの下に参照してください1つのスレッドのみがint変数を更新できることを確認する必要がある場合に使用します。その利点は、値を変更する操作がスレッドセーフな方法で実行されるため、外部同期が必要ないことです。
はfollowindコードを考えてみましょう:private int count;
public int updateCounter() {
return ++count;
}
複数のスレッドがupdateCounterメソッドを呼び出したい場合、それはそれらのいくつかは同じ値を受け取ることになる可能性があります。 ++カウント操作がアトミックではないのは、1つの操作だけでなく、3つの操作から成っている理由です。read count, add 1 to it's value and write it back to it
。複数の呼び出しスレッドは、その変数が変更されていないものとして最新の値を参照できます。
上記のコードは、これを交換する必要があります
private AtomicInteger count = new AtomicInteger(0);
public int updateCounter() {
return count.incrementAndGet();
}
incrementAndGet
方法がアトミック格納された値をインクリメントし、それが外部synchonizationを用いることなく、値のリターンが保証されます。
値が変更されない場合は、AtomicIntegerを使用する必要はありません。intを使用するだけで十分です。
- 1. Javaの(Integer)yと新しいInteger(y)の違いは何ですか?
- 2. Java IntegerクラスとcompareTo()
- 3. ArrayList <Integer>の違いは何ですか[]; ArrayList <Integer> a;
- 4. ScalaのIntとIntegerの違いは何ですか?
- 5. MySQL 5.0のintとintegerの違いは何ですか?
- 6. AtomicReference <Integer>とAtomicIntegerの違いは何ですか?
- 7. Rubyでのobj.to_iとInteger(obj)の使用の違いは何ですか?
- 8. JavaのListクラスのtoArray - なぜ "Integer"のリストを "Integer"配列に変換できないのですか?
- 9. Java Label Integer
- 10. ConcurrentIdentityWeakKeyHashMapとIntegerキー
- 11. fetchedResultsControllerとInteger
- 12. Pascalに相当するC#とは何ですか?Integer、Longword、Extended?
- 13. Sqlite Integer null == java int 0
- 14. SpringBoot:serializeで失敗します。Integerクラス
- 15. JavaからC#へのループの列挙<Integer>を変換しますか? C#でEnumeration <Integer>とは何ですか?
- 16. Volatile変数とAtomic変数の違いは何ですか?
- 17. IntegerはJavaのバグを解析していますか?
- 18. なぜToBinaryStringはIntegerクラスのインスタンスメソッドではありませんか?
- 19. SQL Integerと '&'記号
- 20. Javaの再帰メソッドIntegerオブジェクトのStackOverflowError
- 21. Frege Double to Integer
- 22. Integer Wrapperクラスを2つ比較する
- 23. myBatisのJAVAオブジェクトとマッピングするときにinteger []をList <Integer>に直接変換する方法
- 24. ハッシュマップ<Integer、Integer>を使用しようとしています
- 25. java srcのIntegerクラスのtoStringメソッドで負のintを使用する理由
- 26. Java - ArrayList <Integer> [] []は可能ですか?
- 27. Datetime to Integer
- 28. PostgreSQL - integer []ベストプラクティス
- 29. ios charts integer convert
- 30. VBA Integer from Cell
どのクラスを使用するか? – user18424
まあ、1つは変更可能で、もう1つは不変です。だから、変更可能な値が必要なとき(他のオプションが存在するとき)、 'AtomicInteger'を使うことができます。あなたは' Integer'を使うことはできません。 –
変更可能な値だけでなく** thread-safe **可変値が必要な場合には、 'AtomicInteger'を使用できます。 – Eduen