ホームページ  >  に質問  >  本文

java - 线程同步为什么不一样

package com.dome;

public class Thread01 {

private volatile  static int a =10;
Thread td1 = new Thread(){
    
    public void run(){
        
        for(int i=0;i<3;i++){
            
                a = a+1;
            
            System.out.println(i+"td1:="+a);
        }
        
    }
    
};

Thread td2 = new Thread(){
    public void run(){
        
        for(int i=0;i<3;i++){
            a -=1;
            System.out.println(i+"td2:="+a);
        }
    }
    
};


public static void main(String[] args) {
    Thread01 th = new Thread01();
    th.td1.start();
    
    th.td2.start();
    
}

}

0td1:=9
0td2:=9
1td1:=10
1td2:=9
2td1:=10
2td2:=9

ringa_leeringa_lee2743日前472

全員に返信(1)返信します

  • 迷茫

    迷茫2017-04-18 10:56:18

    a = a + 1a = a - 1 このようなステートメントには、実際には読み取り、変更、書き込みの 3 つの操作が含まれます。 <オル>

  • a = a + 1a = a - 1 这样的语句,事实上涉及了 读取-修改-写入 三个操作:

    1. 读取变量到栈中某个位置

    2. 对栈中该位置的值进行加 (减)1

    3. 将自增后的值写回到变量对应的存储位置

    因此虽然变量 a 使用 volatile 修饰,但并不能使涉及上面三个操作的 a = a + 1a = a - 1具有原子性。为了保证同步性,需要使用 synchronizedスタック上の特定の場所に変数を読み取ります

  • スタック内のこの位置の値に 1 を加算 (減算) します


  • 自動インクリメントされた値を変数に対応する保存場所に書き戻します
  • つまり、変数 a は volatile で変更されていますが、上記の 3 つが関係する a = a + 1a = a - 1 にはなりません。操作 > アトミックであること。同期を確実にするには、synchronized を使用する必要があります: リーリー

    特定の操作の結果:

    🎜🎜🎜 🎜(td1 が出現する場合、a は +1、td2 が出現する場合、a は -1)🎜

    返事
    0
  • キャンセル返事