Javaの並行処理(A):基礎だけでなく、synchronizedキーワードをスレッド

1.マルチスレッドのスレッドの概念:プログラムにおいて、プログラムフラグメント「と呼ばれる独立した動作が可能なスレッド」(スレッド)。マルチスレッド(マルチスレッド)技術は、ソフトウェアやハードウェアからの複数のスレッドの同時実行を指します。

2.マルチスレッドの意義:マルチスレッドはすぐにCPUのタイムスロットを切り替えることができますが、リソースはより良いいくつかのケースで簡単にプログラミング、呼び出すことができ、プログラムの応答より速く、よりスムーズに実行します。

呼び出し可能インターフェースを実装し、Runnableを実装し、Threadクラスの継承:スレッドを開始する方法2

3.なぜ、スレッドの同期を確実にしなければなりませんか?:のJavaマルチスレッドは、スレッド動作複数の変数は、(変化検索データ、例えば、付加および欠失)リソースを共有するとき、制御を可能に不正確なデータ、互いに競合をもたらす、同期ロックを回避するように添加しましたスレッドは、操作の前にない、従って一意と変数の精度を確保すること、完了するために他のスレッドから呼び出されます。

4.基本的なスレッド同期:使用して同期すると、キーワード、可変ドメインの特定の揮発性を待機して方法を通知します。

パブリック クラスT {
     プライベート int型 COUNT = 10 ;
     プライベート O =オブジェクト新しい新しいオブジェクト(); 

    公共 ボイドM(){
         同期(O){
             // 以下のコードを実行する任意のスレッドは、ロックoを取得する必要があり 
            count-- ; 
            のSystem.out.println(にThread.currentThread()のgetName() + "COUNT =" + COUNT); 
        } 
    } 
}

このコードを最初のスレッドは、メソッドMを実行するスレッドが、複数の仮定、同期オブジェクトのヒープメモリoをロックされ、この時間は、それがランキングする必要があり、第二のスレッドが来ません実行スレッド、ロックにのみ実行後、解放することができます。ロックと呼ばれる概念がありミューテックスは、同期がミューテックスで、。

パブリック クラスTlの{
     プライベート 静的 int型 COUNT = 10 ; 

    公共 同期 静的 ボイドM(){
         // ここでは、と等価である同期(T3.class) 
        count-- ; 
        。のSystem.out.println(にThread.currentThread()のgetName() + "COUNT =" + COUNT); 
    } 

    パブリック 静的 ボイドミリメートル(){
         同期(TL。クラス){
             // 考察:書かれたここで(この)することができる同期?
            count-- ; 
        } 
    } 
}

ここで考えると、同期に注意を払うが、新しいオブジェクトにアクセスできる必要はありません変更された変更の静的メソッドと静的プロパティ、静的なメソッドとプロパティをあるので、新しい対象がない、シンクロックはT3.classオブジェクトです。

パブリック クラス T2の実装のRunnable {
     プライベート int型の数= 10 ; 

    @Override 
    公共 / * 同期* /  無効実行(){  - 
        System.out.println(。にThread.currentThread()のgetName() + "カウント=" + カウント数)。
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 
        T2、T = 新しいT2()。
        以下のためにINT ; I <5; iが0 = I ++ ){
             新しいスレッド(Tは、 "スレッド" +  I).start();
        }
    } 
}

上記のコードは、5つのスレッドを開いて実行runメソッドをするマイナス動作の1カウントするために、ここでの問題は、リソースが発生つかむスレッド。最初のスレッドが実行メソッド、プロセス及び還元を実行するときに、第2のスレッドの減算は、最初のスレッドの前に起こり得る場合、第二のスレッドも、また同一の実行及び還元では、この方法に入りました出力カウントは、この時間は、スレッドリエントラントがありました。方法は一つだけのスレッドが終了するランキング、synchronizedキーワードを追加することができます処理、2番目のスレッドがその同じ時間にあり、それを動作させるための一つのスレッドのみ、入力することができアトミックを

パブリック クラスアカウント{ 

    / ** 
     *口座名義と口座残高
     * / 
    文字列名; 
    ダブルバランス; 

    / ** 
     *設定勘定残高は、データを読み取るために、睡眠への最初のスレッドです
     * @paramの名前
     * @param バランス
      * / 
    公共 同期 無効 SET(文字列名、ダブルバランス){
         この .nameの= 名前; 

        試み{ 
            のThread.sleep( 2000 ); 
        } キャッチ(InterruptedExceptionあるE){ 
            e.printStackTrace(); 
        } 
        この.balance = バランス; 
    } 

    公共 ダブルgetBalance(文字列名){
         戻り 、この.balanceと、
    } 

    パブリック 静的 ボイドメイン(文字列[]引数){ 
        アカウント = 新しい)(アカウント。
        新しいスレッド(() - > a.set( "zhangsan"、100.0 ))(開始);。

        試す{ 
            TimeUnit.SECONDS.sleep( 1 )。
        } キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        } 
        のSystem.out.println(a.getBalance( "zhangsan" ));

        試す{ 
            TimeUnit.SECONDS.sleep( 2 )。
        } キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        } 
        のSystem.out.println(a.getBalance( "zhangsan" )); 
    } 
}

これは小さなデモで、コードのみのセット方法は、ロックがgetメソッドでロックされていない、この時間があるだろうダーティリードする現象。ソリューションはロックされ、読み書きの方法です。

パブリック クラスT3 { 

    同期 のボイドM1(){ 
        System.out.printlnは( "M1スタート" );
        試す{ 
            TimeUnit.SECONDS.sleep( 1 )。
        } キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        } 
        M2()。
    } 

    同期 ボイドM2(){
         試み{ 
            TimeUnit.SECONDS.sleep( 2 )。
        } キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        }
        System.out.printlnは( "M2" ); 
    } 
}

この場合は、M1とM2プラス方法は、M1、M2の実行が再び実行されたときに、これは可能であるが、ロックされています。同期方法は、別の同期方法を呼び出すことができ、すなわち、同期ロックが取得されるリエントラントロックコンセプトがあり、デッドロック、複数のスレッドがリソースを押収し、お互いの待機を引き起こすことをデッドロック手段は。たとえば、ボックスにのみ必要な2つのキーを開くことができ、キーは二人の手にあった、二人の男は、オープンボックスで、その結果、お互いに他の人のキーを競います。

おすすめ

転載: www.cnblogs.com/ruiyeclub/p/12288551.html