他の同期方法同期インスタンスメソッド1スレッドがオブジェクトにアクセスしている場合、他のスレッドがオブジェクトにアクセスすることができません
各インスタンスメソッドのために、ロックを修飾する同期インスタンスメソッドにアクセスするための一つのスレッドは、このスレッドがロックオブジェクトを得たので、他のスレッドがオブジェクトのロックを取得できない、それはアクセスできない場合、オブジェクトに適用されそのオブジェクトの他の同期方法
2.取得する方法、2つ(またはそれ以上)のねじ山の変形例同期同じ正しい並行性を達成するために、ロックオブジェクト。
シンプルな1スレッド:
1 クラス MyThreadは実装のRunnable { 2 静的 INT Iと、 3 4 公共 INT GETI(){ 5 リターンI。 6 } 7 8 公共 同期 ボイドincrI(){ 9 I ++ 。 10 } 11 12 @Override 13 公共 ボイドラン(){ 14の ための(INT J = 0; J <1000000; J ++ ){ 15 incrI()。 16 } 17 } 18 }
2つのスレッドが同じオブジェクト(myThread)ロックを取得します:
1つの パブリック クラスSynTest { 2 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ 3 =新しいMyThread MyThread myThreadを(); 4 スレッドT1 =新しいスレッド(myThread)。 5 スレッドT2 =新しいスレッド(myThread)。 6 t1.start()。 7 t2.start()。 8 t1.join()。 9 t2.join()。 10 11 のSystem.out.println(MyThread.i)。 12 } 13 }
静的メソッドを同期動作する場合3.は、オブジェクト・クラスをロックするロックは、現在のクラスです。2つの異なるオブジェクトを持つ2つのスレッドを構築することが可能であるが、これらは同じロック(クラスオブジェクトのロック)を取得するために、2つのスレッドです、正しいの同時実行を実現することが可能です。
1 パブリック 同期静的 ボイドincrI(){ 2 、I ++ 。 3 }
1つの パブリック クラスSynTest { 2 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ 3 = MyThread myThread 新しいMyThreadを()。 4 スレッドT1 = 新しいスレッド(myThread)。 5 スレッドT2 =新しいスレッド(新しいMyThread())。 6 t1.start()。 7 t2.start()。 8 t1.join()。 9 t2.join()。 10 11 のSystem.out.println(MyThread.i)。 12 } 13 }
4. synchronid基本となる実装
修正されたコードブロック:monitorenterとmonitorexit指示。
テストコード:
1 パブリック クラスSynBlock { 2 プライベート int型I; 3 4 公共 ボイドINCR(){ 5 同期(本){ 6 I ++ 。 7 } 8 } 9 }
javapのデコンパイル後:第二は、自動的に実行異常終了のために生成され、あなたが終了すると、最初の1が正常に行われ、2つの終了があるでしょう
修正方法:使用ACC_SYNCHRONIZEDロゴ
5.同期の最適化:バイアスロック、軽量ロック
偏ったロック:同じスレッドで複数回同じロックを取得し、直接の取得を申請することなく、パフォーマンスを向上させることができます。これは、競争力の弱い状況をロックするために適用されます。
軽量ロック:バイアスされ、ロックが失敗した後は、軽量ロックは、複数のスレッドの代替実行、あまり競争にも適用となります。
スピンロックは:あなたがロックを取得することができれば、現在のスレッド短いサイクルは、直接それを取るように、すぐにそれ以外の場合は、拡張ヘビー級ロック、近い将来のスレッドにロックされますと仮定します。
6リエントラントの意味:ロック要求独自のリソース、ロックへの直接アクセスを保持しているスレッド、再び適用する必要はありません。
この方法は、3つのモニターオブジェクトを取得しなければならない、と同期モニタオブジェクトを取得することを確認することができますので、7待機/通知/のnotifyAllは、同期させる必要があります。
参考: