同一程序的差异结果

Asl*_*wer -1 java

public class suspendCheck extends Thread{

    int t ;

    public static void main(String args[]) throws InterruptedException {
        suspendCheck as = new suspendCheck();

        Thread t2 = new Thread(as);
        t2.start();
        Thread t3 = new Thread(as);
        t3.start(); }

    public void run(){
        if(t==0){
        System.out.println("JAVA Develper");
        t= ++t;
        }
        else{

            System.out.println("JAVA Test");
            }

        }
}
Run Code Online (Sandbox Code Playgroud)

多次运行此程序后,存在差异和差异:

通常:

JAVA Develper
JAVA Develper
Run Code Online (Sandbox Code Playgroud)

并偶尔:

JAVA Develper
JAVA Test
Run Code Online (Sandbox Code Playgroud)

我对此感到震惊.我哪里做错了?

ζ--*_*ζ-- 7

是的,这是可以接受的.这里唯一可怕的事情是你试图使用线程而不知道它们的局限性.

您可以使用一个线程轻松完成此操作.你可以在这里采取安全的道路.

线程不保证有关优化和排序的任何内容.如果你真的希望你的int正确改变,那就做吧volatile和/或使用AtomicInteger.如果你想要更好的控制使用锁和/或synchronized块.

在这种情况下,只需声明t为volatile并在访问t或AtomicInteger 周围进行同步,并使用该类的方法进行访问t.

为了将来参考,在没有阅读所有相关警告的情况下尝试这些事情可能导致死亡,窒息,发冷,发烧,溺水,感染,恶心以及无法控制昂贵的机器.

  • @assylias t = ++ t更加困惑;) (4认同)
  • ++ t不是原子的,所以挥发性不够(假设OP希望第一个println只打印一次).而使用AtomicInteger,他将需要一个CAS并避免他当前正在使用的检查 - 然后行为...... (2认同)