同期ロックの誤った使用法とその解決方法

同期キーワードは、一般に「同期ロック」と呼ばれ、同期が必要なメソッドと同期が必要なコードのブロックを装飾するために使用されます。現在のオブジェクトは、デフォルトではロックのオブジェクトです。

同期ロックは同じオブジェクトをロックします。オブジェクトが変更されても、ロックは有効になりません。

ロック失敗のコード:

パブリック クラスIntegerSynTest {

    // スレッドはRunnableインターフェースを実装します
    プライベート 静的 クラス Worker Runnable {を実装します

        プライベート整数num;

        public Worker(Integer num){
             this .nu​​m = 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 );
            forint i = 0; i <5; i ++ ){
                 new Thread(worker).start();
            }
        }
    }
}

ロック失敗の実行結果:

解決策:

同期ロックは、ロックのオブジェクトが変更されない限り、オブジェクトを宣言する必要があるだけで、変更せず、このオブジェクトをロックします(他のメソッドは1つずつリストされず、今後リストされなくなります)。 。

ロック成功のコード

パブリック クラスIntegerSynTest {

    // スレッドはRunnableインターフェースを実装します
    プライベート 静的 クラス Worker Runnable {を実装します

        プライベート整数num;
        / **
         * ---ここで強調---
         *ロックするオブジェクトを宣言する
         * ---ここで強調---
         * / 
        プライベートオブジェクトオブジェクト= new Object();

        public Worker(Integer num){
             this .nu​​m = 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 );
            forint i = 0; i <5; i ++ ){
                 new Thread(worker).start();
            }
        }
    }
}

ロック成功の操作結果:

おすすめ

転載: www.cnblogs.com/mjtabu/p/12702721.html