2017-05-18 15 views
0

アトミック整数incrementAndGet()メソッドはスレッドセーフですか?私はそれに同期キーワードの使用が表示されません。ユニークなIDを生成するためのメソッドを呼び出すと、複数のスレッドがすべての問題につながる場合、私は放浪していますAtomic Integer incrementAndGet()はスレッドセーフですか?

public enum UniqueIdGenerator { 
    INSTANCE; 

    private AtomicLong instance = new AtomicLong(System.currentTimeMillis()); 

    public long incrementAndGet() { 
     return instance.incrementAndGet(); 
    } 
} 

:私は、一意のIDを生成するには、次のコードを使用していますか?

UniqueIdGenerator.INSTANCE.incrementAndGet() 

ありがとう!

+1

はいです。そして、AtomicLongもそうです。 –

+2

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html。これは、AtomicIntegerのjavadocの最初の文からリンクされています。そして、それは言います:*単一の変数でロックフリーのスレッドセーフなプログラミングをサポートするクラスの小さなツールキット* –

+2

スレッドセーフであるだけでなく、実際にスレッド安全性がそれを使用する唯一の理由です単純なint型)。 – yshavit

答えて

2

はい、そうです。

1

はい! java.util.concurrentパッケージの一部です。

1

はい。実際には、これはone of the stated goals of implementing AtomicLongです:

AtomicLongを同時にincrementAndGetにアクセスする複数のスレッドのそれぞれが固有の番号を取得するようにアトミックインクリメントされたシーケンス番号

などのアプリケーションで使用されています。

1

AtomicIntegerAtomicLongの間で、atomicのパッケージクラスは、スレッドセーフであるだけでなく、同期されたより効率的なスレッドセーフティメカニズムを使用します。

java.util.concurrent.atomic 

単一の変数に対するロックフリーでスレッドセーフなプログラミングをサポートするクラスの小規模なツールキット。

boolean compareAndSet(expectedValue, updateValue); 

インスタンス:

本質的に、このパッケージのクラスは、フォームの原子条件付き更新操作を提供するものと揮発性の値、フィールド、および配列要素の概念を拡張しますクラスAtomicBoolean,AtomicInteger,AtomicLongおよびAtomicReferenceのそれぞれは、対応するタイプの単一の変数へのアクセスおよび更新を提供する。各クラスは、そのタイプの適切なユーティリティメソッドも提供します。たとえば、クラスAtomicLongおよびAtomicIntegerは、アトミックインクリメントメソッドを提供します。

関連する問題