静的変数、インスタンス変数、ローカル変数のマルチスレッド環境でのスレッドセキュリティ問題javaマルチスレッド

3939 ワード

静的変数:スレッドは安全ではありません.
静的変数はクラス変数であり、メソッド領域に位置し、すべてのオブジェクトを共有し、メモリを共有します.静的変数が変更されると、他のオブジェクトが変更に表示されるため、スレッドは安全ではありません.
≪インスタンス変数|Instance Variables|emdw≫:単一のスキーマ(オブジェクト・インスタンスが1つしか存在しない)のスレッドは非安全で、単一のスレッドは安全ではありません.
インスタンス変数はオブジェクトインスタンスプライベートであり、仮想マシンのスタックに割り当てられ、システムにこのオブジェクトのインスタンスが1つしか存在しない場合、マルチスレッド環境では静的変数のように、あるスレッドによって修正された後、他のスレッドは修正に対してすべて表示されるため、スレッドは安全ではない.各スレッドが異なるオブジェクトで実行されている場合、オブジェクトとオブジェクト間のインスタンス変数の変更は互いに影響しないため、スレッドは安全です.
ローカル変数:スレッドが安全です.
各スレッドが実行されると、ローカル変数はそれぞれのスタックフレームのワークメモリに格納され、スレッド間で共有されないため、スレッドセキュリティの問題はありません.
 
静的変数スレッドのセキュリティ問題のシミュレーション:
----------------------------------------------------------------------------------
/** 
  *            
  *  ------------------------------ 
  *         1      |      2 
  *  ------------------------------ 
  *   static_i = 4;  |    
  *   static_i = 10; |    
  *                | static_i = 4; 
  *   static_i * 2;  |    
  *  -----------------------------
 * */
public class Test implements Runnable
{
    private static int static_i;//     
    
    public void run()
    {
        static_i = 4;
        System.out.println("[" + Thread.currentThread().getName()
                + "]  static_i   :" + static_i);
        static_i = 10;
        System.out.println("[" + Thread.currentThread().getName()
                + "]  static_i*3  :" + static_i * 2);
    }
    
    public static void main(String[] args)
    {
        Test t = new Test();
        //                   
        for (int i = 0; i < 3000; i++)
        {
            //t    new Test(),                ,     
            new Thread(t, "  " + i).start();
        }
    }
}

コードアノテーションでシミュレーションした場合、スレッド1がstatic_を実行するi = 4;  static_i = 10; スレッド2が実行権を取得し、static_i = 4;スレッド1が実行権を取得するとstatic_を実行するi * 2;必然的に結果4*2=8を出力し、このシミュレーションに従って、コンソールで出力8の結果を見ることができます.
インスタンス変数スレッドのセキュリティ問題のシミュレーション:
----------------------------------------------------------------------------------
public class Test implements Runnable
{
    private int instance_i;//    
    
    public void run()
    {
        instance_i = 4;
        System.out.println("[" + Thread.currentThread().getName()
                + "]  instance_i   :" + instance_i);
        instance_i = 10;
        System.out.println("[" + Thread.currentThread().getName()
                + "]  instance_i*3  :" + instance_i * 2);
    }
    
    public static void main(String[] args)
    {
        Test t = new Test();
        //                   
        for (int i = 0; i < 3000; i++)
        {
            //        t   ,      
            new Thread(t, "  " + i).start();
        }
    }
}

本明細書の冒頭の解析では、静的変数のように、各スレッドが同じオブジェクトのインスタンス変数を変更しているため、スレッドセキュリティの問題が発生するに違いありません.
単一の例の場合、インスタンス変数スレッドは安全ではないことがわかります.
 
new Thread(t,"スレッド"+i).start();new Thread(new Test()、「スレッド」+i)に変更する.start();シミュレーションが単一でない場合、スレッドセキュリティの問題はありません.
ローカル変数スレッドのセキュリティ問題のシミュレーション:
----------------------------------------------------------------------------------
 
public class Test implements Runnable
{
    public void run()
    {
        int local_i = 4;
        System.out.println("[" + Thread.currentThread().getName()
                + "]  local_i   :" + local_i);
        local_i = 10;
        System.out.println("[" + Thread.currentThread().getName()
                + "]  local_i*2  :" + local_i * 2);
    }
    
    public static void main(String[] args)
    {
        Test t = new Test();
        //                  
        for (int i = 0; i < 3000; i++)
        {
            //        t   ,       
            new Thread(t, "  " + i).start();
        }
    }
}

コンソールに異常データは表示されませんでした.
 
---------------------------------------------------------------