Javaスレッド同時アクセスコード分析


この文章は主にJavaスレッドの同時アクセスコードの分析を紹介しています。ここでは例示的なコードを通じて紹介されています。皆さんの学習や仕事に対して一定の参考学習価値があります。必要な友達は下記を参考にしてください。

class ConcurrentThread {
  /**
   *               
   * volatile   :
   * 1):                     ,              ,                
   * 2):         
   * volatile     JVM        (    )        ,        
   */

  private volatile int count = 0;

  public void inc() {
    try {
      Thread.sleep(3);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    count++;
  }

  @Override
  public String toString() {
    return "[count=" + count + "]";
  }
}
//----------------------------------------

public class VolatileTest {
  public static void main(String[] args) {
    final ConcurrentThread counter = new ConcurrentThread();
    for (int i = 0; i < 1000; i++) {
      new Thread(new Runnable() {
        @Override
        public void run() {
          counter.inc();
        }
      }).start();
    }
    System.out.println(counter);
  }
}

理由説明:Javaのメモリモデルには各スレッドが実行されています。スレッドスタックにはスレッド実行時の変数値情報が保存されています。
スレッドがあるオブジェクトにアクセスする時:
1、対象の参照によって、ヒープメモリに対応する変数の値が見つかります。
2、ヒープメモリ変数の具体的な値をスレッドローカルメモリにロードし、変数コピーを作成した後、スレッドは対象とヒープメモリ変数の値とは一切関係なく、コピー変数の値を直接修正し、修正後のある時刻(スレッドが終了する前)に、スレッド変数コピーの値を自動的にオブジェクトに書き込みます。このように積み重ねられたオブジェクトの値が変化します。
上記の例によれば、上のメイン関数で1000個のスレッドが開かれています。各スレッドには変数のコピーがあります。各スレッドは変数を一時的に修正しただけです。スレッドが終わったら、修正した値をメインメモリに書き込みます。このようにスレッドセキュリティ問題が発生します。したがって、結果は1000に等しいわけではなく、一般的には1000を下回ります。

以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。