JAVA Synchronizedキーワードを深く分析します。


同時性の概念?
ロックの機構を利用して同期を実現するもので、ロック機構には以下の2つの特性がある。
相互反発:つまり同じ時間に一つのスレッドだけがあるオブジェクトロックを持つことが許され、この特性によりマルチスレッドにおける協調機構が実現され、同じ時間に一つのスレッドだけが同期したいコードブロック(複合動作)にアクセスする。相互反発性はしばしば操作の原子性とも呼ばれます。
可視性:ロックが解放される前に、共有変数に対して修正されたことを確認しなければなりません。その後、このロックを取得した他のスレッドについては可視です。すなわち、ロックを取得する際には最新の共有変数の値が必要です。そうでないと、他のスレッドはローカルキャッシュのコピー上で動作を継続し、不一致を引き起こす可能性があります。
Synch ronizedの使い方?
1.同期方法
同期非静的方法

/**
 * Synchronized      
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {

  /**
   *        
   * @Description: TODO
   * @returnType: void
   */
  public synchronized void accessResources1(){
    try {
      TimeUnit.SECONDS.sleep(2);
      System.out.println(Thread.currentThread().getName()+" is running!");
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {

    //        
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources1).start();
    }

  }

}
 同期静的方法

/**
 * Synchronized      
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {
  /**
   *       
   * @Description: TODO
   * @returnType: void
   */
  public synchronized static void accessResources0(){
    try {
      TimeUnit.SECONDS.sleep(2);
      System.out.println(Thread.currentThread().getName()+" is running!");
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    //       
    for(int i=0;i<5;i++){
      new Thread(SynchronizeDemo01::accessResources0).start();
    }

  }

}
2.同期コードブロック
コードブロックのオブジェクトは、オブジェクトのロックを取得し、Javaでは、オブジェクトごとに1つのmonitorオブジェクトがあります。このオブジェクトは、Javaオブジェクトのロックです。通常は「内蔵ロック」または「オブジェクトロック」と呼ばれます。クラスのオブジェクトは複数あることができます。したがって、オブジェクトごとに独立したオブジェクトロックがあり、互いに干渉しません。

/**
 * Synchronized      
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {

  /**
   * synchronized   (  ),this       
   * @Description: TODO
   * @returnType: void
   */
  public void accessResources2(){
    synchronized(this){
      try {
        TimeUnit.SECONDS.sleep(2);
        System.out.println(Thread.currentThread().getName()+" is running!");
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }


  public static void main(String[] args) {
    //        
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources2).start();
    }

  }

}
コードブロック(クラス.クラス)は、クラスの鍵を取得し、Javaには、各クラスに対してロックがあり、「クラスの鍵」とも呼ばれます。クラスの鍵は実際には対象の錠で実現されます。クラスのクラスのクラスのオブジェクトロックです。各クラスには一つのクラスのオブジェクトしかないので、各クラスには一つのクラスの鍵しかないです。

/**
 * Synchronized      
 * @author Administrator
 *
 */
public class SynchronizeDemo01 {

  /**
   * synchronized   ( .class)
   * @Description: TODO
   * @returnType: void
   */
  public void accessResources3(){
    synchronized(SynchronizeDemo01.class){
      // Class                 
      try {
        TimeUnit.SECONDS.sleep(2);
        System.out.println(Thread.currentThread().getName()+" is running!");
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args) {
    //        
    SynchronizeDemo01 demo01 = new SynchronizeDemo01();
    for (int i = 0; i < 5; i++) {
      new Thread(demo01::accessResources3).start();
    }

  }

}
Javaオブジェクトのmonitorオブジェクトの役割?
1.あるスレッドがこのオブジェクトを占有したい場合は、まず、monitorのカウンタが0かどうかを判断し、0がまだスレッドが占有されていないことを示す場合は、このスレッドはこのオブジェクトを占有し、この対象のmonitor+1とすることができる。このスレッドが他のスレッドによって占有されていることを示す0でないと、このスレッドは待つ必要があります。スレッドが占有権を解放すると、モノレール-1。
2.同じスレッドは同じオブジェクトに対して複数回ロックできます。+1、+1、再入力性
Synch ronizedコードブロックのロックアップ機構?
1.コードブロックのロックをかけて、ファイルを逆コンパイルすることにより、MonitonterとMonitoxitの間にロックがかけられている部分を発見しました。

2.方法のロックをかけて、ファイルを逆コンパイルしたところ、ACC_が表示されています。SYNCHRONIZEDの表記は施錠方法です。

 Java仮想マシンの中のいくつかの鍵の対比?

無状態ロック:ロックなし
偏向ロック:対象が初めてあるスレッドに占有されると、「偏向ロック」フィールドを1にし、「ロックビット」を01にしてスレッド番号を書き込み、他のスレッドにアクセスすると競合します。競争に失敗したら軽量ロックにアップグレードします。偏向ロックは、初めてアクセスしたスレッドの獲得に成功しました。
     ライト級ロック:スレッドが交互に適用され、相互反発があまり強くなく、バイアスロックがCASアルゴリズムでロックを取得できなくなり、ロックマークの位置を00とする。
ヘビー級ロック:強く反発し合い、ロックマークの位置は10で、待ち時間は長いです。
以上はJAVA Synchronizedキーワードの詳しい内容を深く分析しました。JAVA Synchronizedキーワードに関する資料は他の関連記事に注目してください。