上面的是不同线程的输出,还没有执行到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--的结果(这里的其它线程指的是在他之前执行的线程)