多线程,输出(x--); 与 输出(x)之后再x--;的输出结果不同

图片说明

上面的是不同线程的输出,还没有执行到x--这一步
而下面的就是直接输出x--,那么同时线程1得到的x是其他线程x--的结果(这里的其它线程指的是在他之前执行的线程)

加入下面两个方法
 public void a(){
        System.out.println("a...."+x);
        x--;
    }
    public void b(){
        System.out.println("a...."+x--);        
    }

    生成的字节码是
    public void a();
  Code:
   0:   getstatic       #19; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   new     #25; //class java/lang/StringBuilder
   6:   dup
   7:   ldc     #27; //String a....
   9:   invokespecial   #29; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   12:  aload_0
   13:  getfield        #12; //Field x:I
   16:  invokevirtual   #32; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBui
   19:  invokevirtual   #36; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   22:  invokevirtual   #40; //Method java/io/PrintStream.println:(Ljava/lang/String;)V     //这里打印输出,输出时还没有X--,也就是输出100时,X还没有减1,如果其他线程执行快,输出的还是100
   25:  aload_0
   26:  dup
   27:  getfield        #12; //Field x:I
   30:  iconst_1
   31:  isub    //执行了X--
   32:  putfield        #12; //Field x:I
   35:  return

public void b();
  Code:
   0:   getstatic       #19; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   new     #25; //class java/lang/StringBuilder
   6:   dup
   7:   ldc     #27; //String a....
   9:   invokespecial   #29; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   12:  aload_0
   13:  dup
   14:  getfield        #12; //Field x:I
   17:  dup_x1
   18:  iconst_1
   19:  isub                 //执行了X--
   20:  putfield        #12; //Field x:I
   23:  invokevirtual   #32; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBui
   26:  invokevirtual   #36; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   29:  invokevirtual   #40; //Method java/io/PrintStream.println:(Ljava/lang/String;)V   //这里输出,输出时肯定执行了X--,也就是有一个输出100,那必然已经减1了。
   32:  return

你不是多线程输出的么
各个线程是独立运行的
对于你这里面的两个情况
是不会有区别的
后--是运算优先级最低的运算符
对于第二种情况,就是先输出x
然后做x--
跟第一种情况没区别

上面的是不同线程的输出,还没有执行到x--这一步
而下面的就是直接输出x--,那么同时线程1得到的x是其他线程x--的结果(这里的其它线程指的是在他之前执行的线程)