出典:こんにちは学習ネットワーク敏感と熱心なフォーラムはwww.piaodoo.comお互いから学ぶことを歓迎します
コードの2枚でまず見て、いくつかの整数であり、いくつかはのAtomicInteger、以下のとおりであります:
パブリッククラスサンプル1 { プライベート静的整数カウント= 0; 同期のpublic static無効増分(){ ++数えます。 } }
以下は、ののAtomicInteger、次のとおりです。
パブリッククラスサンプル2 { プライベート静的ののAtomicIntegerカウント=新のAtomicInteger(0); パブリック静的ボイドインクリメント(){ count.getAndIncrement()。 } }
整数を使用した場合、状況は同期並列スレッドへのアクセスを確保するために追加しなければならないコードの2枚以上は、なくのAtomicIntegerにプラス同期、表示されません、ここでのAtomicIntegerアトミック操作を提供し、これは次のようになります適切な導入。
はじめのAtomicInteger
AtomicIntegerは、スレッドセーフな方法でアトミック操作Integerクラス、加算および減算動作を提供します。
AtomicIntegerの使用シナリオ
AtomicIntegerは、従って、高い同時実行での使用のために非常に適した整数を使用して実行アトミック操作を提供します。
一部のAtomicIntegerソースを説明
パブリッククラスのAtomicIntegerは数実装にjava.io.Serializable {延び 、プライベート静的最終長いのserialVersionUID = 6214790243416807050Lを //セットアップが更新をUnsafe.compareAndSwapIntを使用するために プライベート静的最終安全でない危険な= Unsafe.getUnsafe(); プライベート静的最終長いvalueOffset。 静的{ 試み{ valueOffset = unsafe.objectFieldOffset (AtomicInteger.class.getDeclaredField( "値")); }キャッチ(例外例){新しいエラー(EX)を投げます。} } プライベート揮発int型の値。
上記のソースコードのAtomicIntegerの一部であり、その下に揮発性のキーワードを使用して値が、揮発性のアクションがここに行うことができる値は、複数のスレッドが変数を共有できるようにすることです、ここで述べたが、問題は、揮発性の使用は、VMの最適化を行いますですアクションのうち、必要な場合、より低い効率で得られ、使用されるべき、及び使用シナリオで使用する、のAtomicIntegerクラスを使用することは自由ではありません。
AtomicIntegerインスタンス
以下は、このコードはコードの一部でITの家から借りている、のAtomicIntegerの1つのインスタンスを使用し、マルチスレッドです。
AtomicTestクラス{パブリック 静的ロングrandomtime(){ リターン(ロング)(Math.random()* 1000); } 公共の静的な無効メイン(文字列[] args){ //収容可能なキュー・ファイル100をブロック 最終BlockingQueueのを<ファイル> =新しい新しいキューLinkedBlockingQueue <ファイル>(100); //スレッドプール 最終Executors.newFixedThreadPool ExecutorServiceのエグゼクティブ=(5)、 最終的なルートファイル=新しい新しいファイル( "D:\\ ISO"); //完了フラグ 最終的なファイルexitFileファイルの新しい新=(「」); //整数原子、読み取りの数は //のAtomicInteger噴霧は、同期の使用を避けるために、ケースに同時更新を達成することができ、パフォーマンスが非常に高いです。 AtomicIntegerののAtomicIntegerの新しい新しいRC =ファイナル(); //整数原子、書き込みの数 のAtomicInteger新しい新WC =()ののAtomicIntegerの決勝; //読み取りスレッド Runnableを新しい新しい=を読み取るRunnableを(){ 公共ボイドRUN(){ ScanFile(ルート); ScanFile(exitFile); } 公共ボイドScanFile(ファイルファイル){ IF(file.isDirectory()){ ファイル[] = File.listFilesファイル(FileFilterの新新(){ パブリックブールは受け入れ(ファイルパス名){ リターンpathname.isDirectory()|| pathname.getPath()endsWith( "ISO");. } }); (ファイルワン:ファイル)のための ScanFile(ワン); } {他 のtry { incrementAndGet方法整数//原子、電流値プラス1の原子が、戻り値が更新されます INTインデックス= rc.incrementAndGetを(); System.out.println( "READ0:" +インデックス+ "" + file.getPath()); //ブロックキューに追加 queue.put(ファイル); }キャッチ(InterruptedExceptionあるE){ } } } }; / /実行と戻り、そのタスクを表すFutureするための方法のRunnableタスクを送信するために提出します。 exec.submit(読む); //書き込み4つのスレッド のための(int型のインデックス= 0;インデックス<4;インデックス++){ //書き込みスレッド 決勝NUM = int型のインデックス; Runnableを新しい新=はRunnableを(){書く 文字列のthreadName =「を書き込み「+ NUM; 公共無効RUN(){ ながら、(真の){ 試み{ のThread.sleep(randomtime()); メソッドincrementAndGet整数//原子、現在の値を加えた1個の原子は、戻り値の更新 int型のインデックス= wc.incrementAndGet(); //取得をし、要素が利用可能になっている前に、このキューの先頭を削除します(必要な場合)を待ちます。 ファイル= queue.takeファイル(); //キューには目標を持っていない (ファイル== exitFile)IF { //が正常終了するために他のスレッドを可能にするために、再度、 "フラグ"を追加 queue.put(exitFile); BREAK; } のSystem.out .println(のthreadName + ":" +インデックス+ "" + file.getPath()); }キャッチ(InterruptedExceptionあるE){ } } } }; exec.submit(書き込み); } exec.shutdown()。 } }
AtomicIntegerの使用の概要
AtomicIntegerは、並行プログラムのためのいくつかの非常に高いでは、同時実行制御アルゴリズムをノンブロッキングが、各シーンには適していません、クラスの異なる値を使用して、さまざまなシナリオで使用されるようにされます。
これは、JavaのAtomicInteger詳細なクラスを使用する方法について、この記事のためにすべてだし、我々は手助けをしたいです。興味のある友人は見ることができます。Javaエンタープライズプロジェクトのアイデアの開発、Javaの地図ストレージアレイとコードの値でJavaのネイティブシリアル化およびシリアル化のパフォーマンスKryoインスタンスの比較分析が出て詳細など、いつでもメッセージを残すことができます任意の質問があり、小扁は、速やかになります全員に返信。
元のアドレスは次のとおりです。http://www.piaodoo.com/thread-13234-1-2.html ストッキングを制御 www.txdah.com 131外www.buzc.org楽しく学習がよりよく学習することができます!