这是一个测试问题。我已经多次运行该代码并得到相同的答案:999999。他们说,即使编写runLoop方法时存在同步,该代码也不会每次都产生相同的结果。我想念什么?public class B extends Thread{ static int a = 0; public static void main(String[] Args){ B MyB = new B(); MyB.start(); runLoop(1000000); System.out.println(a); } public static synchronized void runLoop(int b){ for(int i = 0; i<b; i++){ a=i; } } public void run(){ runLoop(12345678); }} 最佳答案 通常在您打电话时SomeThread.start();正确启动线程需要花费一些时间,这允许正在执行此命令的线程执行其下几行代码,例如SomeThread.start();//lets say it should print "A"System.out.print("B");在许多情况下,将打印BA而不是AB,这就是您的问题所在。因此,如果您的代码在MyB线程将成为start()之前,则主线程可以调用自己的runLoop(1000000);。然后MyB可能会运行runLoop(12345678);,但是现在主线程可能会执行System.out.println(a);,这会以不同步的方式访问a,因此它可能会显示MyB在当前时间点迭代了多少次(因此,两个线程都在访问,这可能会在您每次运行应用程序时产生不同的结果)。如果您声称总是得到响应a,则表示您很幸运,或者没有向我们显示您的真实代码(例如,在999999和MyB.start();之间的情况下,还有其他代码可能需要足够的时间才能让我们runLoop(1000000);就像MyB.start()一样完成)。
10-06 05:53