同期キーワードは、一般に「同期ロック」と呼ばれ、同期が必要なメソッドと同期が必要なコードのブロックを装飾するために使用されます。現在のオブジェクトは、デフォルトではロックのオブジェクトです。
同期ロックは同じオブジェクトをロックします。オブジェクトが変更されても、ロックは有効になりません。
ロック失敗のコード:
パブリック クラスIntegerSynTest { // スレッドはRunnableインターフェースを実装します プライベート 静的 クラス Worker はRunnable {を実装します プライベート整数num; public Worker(Integer num){ this .num = num; } @オーバーライド public void run(){ 同期(数値){ Thread thread = Thread.currentThread(); // System.identityHashCode:Objectオブジェクトが書き換えられたかどうかに関係なく、元のhashCode値を返します 。null 参照のハッシュコードはゼロです System.out.println(thread.getName()+ " -@:--- "+ System.identityHashCode(数値)); num ++ ; System.out.println(thread.getName() + "------ num:" + num + "---" + System.identityHashCode(num)); {を試す Thread.sleep( 1000 ); } キャッチ(InterruptedException e){ e.printStackTrace(); } System.out.println(thread.getName() + "------ num:" + num + "---" + System.identityHashCode(num)); } } public static void main(String [] args){ ワーカーworker = new Worker(1 ); for(int i = 0; i <5; i ++ ){ new Thread(worker).start(); } } } }
ロック失敗の実行結果:
解決策:
同期ロックは、ロックのオブジェクトが変更されない限り、オブジェクトを宣言する必要があるだけで、変更せず、このオブジェクトをロックします(他のメソッドは1つずつリストされず、今後リストされなくなります)。 。
ロック成功のコード
パブリック クラスIntegerSynTest { // スレッドはRunnableインターフェースを実装します プライベート 静的 クラス Worker はRunnable {を実装します プライベート整数num; / ** * ---ここで強調--- *ロックするオブジェクトを宣言する * ---ここで強調--- * / プライベートオブジェクトオブジェクト= new Object(); public Worker(Integer num){ this .num = num; } @オーバーライド public void run(){ // 同期されたロックオブジェクトを変更 (num){ Thread thread = Thread.currentThread(); // System.identityHashCode:Objectオブジェクトが書き換えられたかどうかに関係なく、元のhashCode値を返します 。null 参照のハッシュコードはゼロです System.out.println(thread.getName()+ " -@:--- "+ System.identityHashCode(数値)); num ++ ; System.out.println(thread.getName() + "------ num:" + num + "---" + System.identityHashCode(num)); {を試す Thread.sleep( 1000 ); } キャッチ(InterruptedException e){ e.printStackTrace(); } System.out.println(thread.getName() + "------ num:" + num + "---" + System.identityHashCode(num)); } } public static void main(String [] args){ ワーカーworker = new Worker(1 ); for(int i = 0; i <5; i ++ ){ new Thread(worker).start(); } } } }