上の同期静的メソッド: 例えば: 同期 パブリック 静的 ボイド printa(){。。。} プラスプラス静的および非静的メソッドは基本的に異なる方法であるに同期キーワード: クラスの静的メソッドに適用がロックされて、非静的メソッドは、オブジェクトに適用されているロック など: パブリック クラスモデル{ 同期 公共の 静的な 無効 printa(){ // クラスのロックロックにここに来る のSystem.out.println( "スレッド名:" + 。にThread.currentThread()のgetName())を、 試してみる{ のThread.sleep( 3000 ); システム.out.println( "スレッド名:" +Thread.currentThread()のgetName());. } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } } 同期 のパブリック 静的な 無効 printb(){ // クラスのロックロックにここに来る (System.out.printlnは"スレッド名:" + にThread.currentThread()のgetName());. 試み{ のThread.sleep( 2000 ); のSystem.out.println( "スレッド名:" + 。にThread.currentThread()のgetName()); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } } 同期 公共 ボイド printc(){ // ここでは、オブジェクトがロックを取得しているロック のSystem.out.println( "スレッド名:" + 。にThread.currentThread()のgetNameを()); // Thread.sleep(2000); System.out.printlnは( "スレッド名:" + にThread.currentThread()のgetName()); } } 3つのスレッドを作成し 、パブリック クラススレッド1 拡張スレッド{ プライベートモデルモデル、 公共スレッド1(モデルモデル){ この.MODEL = モデル。 } @Override 公共 ボイド(){ラン スーパー)(.RUN。 Model.printa(); } } パブリック クラススレッド2が延びている スレッド{ プライベートモデルのモデルを、 パブリックスレッド2(モデルモデル){ この .MODEL = モデル。 } @Override 公共 ボイド(){ラン スーパー)(.RUN。 )(model.printb。 } } パブリック クラス Thread3は延び スレッド{ プライベートモデルのモデルを、 公共Thread3(モデルモデル){ この .MODEL = モデル。 } @Override 公共 ボイド(){ラン スーパー)(.RUN。 model.printc(); } } 运行一下代码: モデルモデル = 新しいモデル()。 スレッド1スレッド1 = 新しいスレッド1(モデル)。 thread1.setName( "A" ); thread1.start(); スレッド2スレッド2 = 新しい新しいスレッド2(モデル); thread2.setName( "B" ); thread2.start(); Thread3 thread3 = 新しい新しいThread3(モデル); thread3.setName( "C" ); thread3.start(); 結果: スレッド名: スレッド名:Cの スレッド名:Cの スレッド名: スレッド名:B スレッド名:B の分析結果:非同期とC、AとBとの同期。理由:ABは同じロックを取得する:クラスのロックを、cはロックオブジェクトを得た 同期(クラス)それを用いた静的メソッドのロックと同期を取得するには :今printcモデルは上記の方法に変更したことになるよう 公共 ボイド {)printc( 同期(モデル。クラス {) // クラスのロックを取得するには、この時他の2つの方法でロックする同期方法で のSystem.out.println( "スレッド名:" + にThread.currentThread()のgetName()); 試み{ のThread.sleep( 2000 ); } キャッチ(InterruptedExceptionあるE){ E .printStackTrace(); } のSystem.out.println( "スレッド名:" + 。にThread.currentThread()のgetName()); } } 再度上記のコードを実行し、結果: スレッド名: スレッド名: スレッド名:Cの スレッド名:Cの スレッド名:Bの スレッド名:B の結果から3つの同期方法を 使用すると、ロックオブジェクトとして文字列を使用する場合、同じの同じ文字列のロックオブジェクト、ということに注意してください volatileキーワードの使用: 主な役割は、複数のスレッド間で変数を作ることです再び目に見える 原則:揮発性変数は、これを取得するには、変更されました変数の値は、変数がなく、スレッドから、共通スタックから値を取得することを余儀なくされたときに 、変数のプライベートデータスタックの取得値 :揮発性、スレッドの安全性の問題 揮発性を確保するために、二つの側面を構成する原子のスレッドの安全性と可視性スレッド間の可視性が、スレッド間のアトミック性を保証することはできませんが 追加されました: マルチスレッド三つの特徴:原子、視認性、秩序 アトミック:その操作が中断されていない手段があっても、複数のスレッドを一緒に実行時に、一度起動アクションは、他のスレッドからの干渉はありません。 例えば、静的なフルのために 変数iが、彼1に割り当てられたスレッド、値二つのスレッドを割り当てるINT、スレッドBが彼に割り当て -1。どんなに二つのスレッド どのような方法インチ 仕事のどのようなペース、iの値は、いずれかの、どちらかである1 -1 。スレッドAとスレッドBの間には干渉なしません。これは、中断することができない、アトミックの機能です。 視認性:すぐにこの変更かどうかを知ることができるスレッドは、共有、他のスレッドの変数の値を変更したときのことをいいます。明らかに、シリアルのために、問題の可視性は存在しません。 発注:プログラムの同時実行が順不同で表示される場合がありますとき。EDITORIALコードは、後に実行されます:それは視覚的な印象がある与えます。その理由は、プログラム中の問題のためであるので 実行が、命令を再配置することができる、再配置指示は、必ずしも元の命令の順序と一致しません。 まず、一般的なスレッドのスタックと独自のスタックは、 あなたがスレッドを起動したときに、変数の値は、官民のスタックスタックとスレッドに存在しています。これは、JVMに設定されている - 効率のスレッドがサーバモードのとき、実行するため のスレッドがプライベート・スタック変数の値で撮影された、他のスレッドがある場合でも、変数の値が更新され、変更されている一般的なスタックの変数値であり、 民間スタック値は、スレッドを実行している問題につながる、変更されることはありません