ここでは、ObjLockクラスを作成し、Runnableインタフェースを実装します。デモおよび非静的メソッドを持つクラスを作成し、静的メソッドは、synchronizedキーワードを変更しました。
非静的メソッド
パブリック クラス ObjLockは実装したRunnable { デモのデモを。 公共ObjLock(デモデモ){ この .demo = デモ。 } 公共 ボイドラン(){ demo.getI(にThread.currentThread()のgetName()。)。 } パブリック 静的 ボイドメイン(文字列[]引数){ デモデモ = 新しいデモ(1 )。 スレッドスレッド = 新しいスレッド(新しい ObjLock(デモ)、 "thread0" ); スレッド1スレッド = 新しい(スレッドを新しいですObjLock(デモ)、 "スレッド1" )。 スレッド2スレッド = 新しいスレッド(新しい ObjLockを(新しいデモ(2))、 "スレッド2" )。 thread.start(); thread1.start(); thread2.start(); } } クラスデモ{ 静的 int型I。 デモ(int型I){ この .I = I。 } パブリック 静的 同期 ボイドstaticGetI(文字列S){ ための(int型 J = 0; J <10000; J ++ ){ のSystem.out.println(I+ "---------" + S)。 } } パブリック 同期 ボイドGETI(文字列S){ ため(INT J = 0; J <10000; J ++ ){ System.out.printlnは(I + "---------" + S)。 } } }
プログラムを実行し、次のような結果を見ることができます:
1 --------- thread0 1 --------- thread0 2 --------- スレッド2 1 --------- thread0 2 ----- ---- スレッド2 1 --------- thread0 1 --------- スレッド1 1 --------- スレッド1 2 --------- スレッド2 1 --------- スレッド1 1 --------- スレッド1 1 ---------スレッド1
私たちは、Thread0とスレッド2が交互に、そしてスレッド2スレッド1を交互に、しかしThread0スレッド1とが交互に表示されません見ることができます。
オブジェクト上の非静的メソッド呼び出しのロックは実際の方法をロックするからです。Thread0とスレッド1は、同じオブジェクトを使用するので、排他的な、しかし、スレッド2は影響を受けません。
staticメソッド
GETI後の静的メソッドに
公共 ボイドラン(){ demo.staticGetI(にThread.currentThread()のgetName()。)。 }
テストは3つのスレッドが相互に排他的で発見しました。
同期静的メソッドを変更するとき、マルチスレッド、クラスロックを取得した(すなわち、クラス自体、注記しない例)と、全体のスコープの静的メソッドは、オブジェクトは、このクラスのすべてのオブジェクトの役割です。
同期オブジェクトは、それぞれ、静的方法と二つのスレッドで非静的同期メソッドを呼び出し
コードを変更
公共 ボイドラン(){ 場合(。。にThread.currentThread()のgetName()等号( "thread0" )){ demo.staticGetI(。にThread.currentThread()のgetName()); } そう であれば(。。にThread.currentThread()のgetName()に等しい( "スレッド1" )){ demo.getI(にThread.currentThread()のgetName())。 } }
結果:いいえ、相互に排他的。
説明:それは、オブジェクトの呼び出しですが、ロックタイプの2種類の方法が、静的メソッドの呼び出しは、実際にクラスオブジェクトを呼び出しているので、つまり、2つの方法が同じオブジェクトがロックされていない生産、それは相互に排他的ではないだろう、それは同時に実行されます。