Javaマルチスレッド学習(三)

3156 ワード

キーワードでsynchronizedを宣言する方法には弊害があります。
  • synchronized同期コードブロックの使用:2つの同時スレッドがバケットの1つのオブジェクトobjectにアクセスするときのsynchronized同期コードブロックは、一時的に1つのスレッドだけが実行され、他のスレッドが現在のスレッドがこのコードブロックを実行するのを待つ必要があります。
    synchronized(this){
    }
  • は、スレッドがobjectの1つのsynchronized同期コードブロックにアクセスすると、他のスレッドは、このObjectオブジェクト中の非synchronized同期コードブロックにまだアクセスすることができる。従って,同期法より効率を向上させることができる。
  • objectオブジェクト中のコードは、synchronizedブロック内ではなく非同期で実行され、synchronizedブロックでは同期実行されます。
  • synchronizedコードブロック間の同期性:synchronized同期コードブロックを使用する場合、他のスレッドが同じobject内の他のすべてのsynchronized(this)同期コードブロックへのアクセスを遮断することに注意が必要である。これは、synchronizedが使用するオブジェクトモニタが同じであることを示しています。現在のsynchronized同期コードブロックが実行された後に、他のsynchronized同期コードブロックにアクセスする必要があります。
  • は、synchronized方式と同様に、synchronized同期コードブロックも現在のオブジェクトをロックしている。
  • 任意のオブジェクトを対象モニタ6.1以上のスレッドとして同じオブジェクトの異なる名前のsynchronized同期方法またはsynchronized同期コードブロックを呼び出します。呼び出しの効果は順番に実行され、同期され、ブロックされます。6,2 synchronizedコードブロックは、任意のオブジェクトを対象モニターとして同期する機能をサポートしており、多くはインスタンス変数および方法パラメータである。使用方法はsynchronizedです。  x){}複数のスレッドが持つオブジェクトモニタが同一のオブジェクトであることを前提に、同じ時間に1つのスレッドだけがsynchronized(非thisオブジェクトx)の同期コードブロック内のコードを実行することができる。 6.3ロック非thisオブジェクトの利点:synchronized(非thisオブジェクト)同期コードブロックと同期方法とsynchronized(this)同期コードブロックは非同期であり、他のロックthis同期方法と競合しない場合、運転効率を大幅に向上させることができる。6.4 synchronized(非thisオブジェクト)同期コードブロックを用いて同期操作を行う場合、対象モニタは同一オブジェクトである必要があり、そうでないとロックが多くなり、結果として非同期運転となる。6.5 synchronized(非thisオブジェクト)同期コードブロックを使用して、汚い読み問題を回避することができます。
  • synchronized(非thisオブジェクトx)同期コードブロックは、xオブジェクト自体を「対象モニター」としているので、以下の3つの結論があります。1)複数のスレッドが同時にsynchronized(x)同期コードブロックを実行すると、同期効果があります。2)他のスレッドがxオブジェクト中のsynchronized同期方法を実行すると、同期効果があります。3)他のスレッドがxオブジェクト方法のsynchronizedコードブロックを実行する場合も同期効果があります。
  • 静的同期synchronized方法とsynchronizedコードブロックキーワードsynchronizedは、static静的方法、すなわち現在の*.Javaファイルに対応するクラスをホールドするために、static静的方法に適用することができる。synchronizedキーワードを静的方法に加えると、Classクラスにロックし、synchronizedキーワードを非staticメソッドに加えると対象にロックします。クラスロックは、クラスのすべてのオブジェクトインスタンスに対して機能することができる。同期synchronizedコードブロックは、synchronized staticメソッドと同じ役割をします。synchronized。
  • データタイプStringの定数プール特性1)は、JVMにおいて定数キャッシュプールを有する機能
    String a = "A";
    String b = "A";
    System.out.println(a == b);
    
         :true
    が、synchronized(string)同期ブロックをStringと連携して使用する場合、定数プールによるいくつかの例外に注意する。スレッドAとスレッドBが持つロックはすべて「aa」であり、「aa」のキャッシュカードのプロパティのため、彼らは同じロックを持っているので、スレッドの一つは永遠に実行できない可能性があります。
  • マルチスレッドのデッドロックロック:異なるスレッドがリリースされたくないロックを待っているため、すべてのタスクが完了しないことになります。
    public void run(){
     if(username.equals("a")){
         synchronized(lock1){
             //todo
             synchronized(lock2){
                 //todo
             }
         }
     }
     if(username.equals("b")){
            synchronized(lock2){
                //todo
                synchronized(lock1){
                    //todo
                }
            }
        }
    }
     JDKが持参したツールを使って、デッドロック現象があるかどうかを検査できます。1)jps--スレッドID番号を調べられます。2)jstack-lスレッドid号  --Java stack情報を一覧表示します。
  • 内蔵クラスと静的内蔵クラス1)には2つの同期方法がありますが、異なるロックを使うと運転結果が非同期になります。
  • ロック対象の変更は、任意のデータタイプを同期ロックとしている場合、複数のスレッドが同時にロック対象を持っているかどうか、同じロックオブジェクトを同時に持っている場合、これらのスレッド間は同期しており、それぞれロック対象を得ると、スレッド間は非同期であることに注意が必要である。オブジェクトが変わらない限り、オブジェクトの属性が変更されても、実行の結果は同期されます。