java:执行顺序混乱,没有涉及多线程

java:执行顺序混乱,没有涉及多线程,java,jvm,order-of-execution,Java,Jvm,Order Of Execution,预期的:3行m1对数,然后是3行m2对数 实际:有时m2日志会在m1日志之间打印 这只发生在我同事的机器的上,而不是其他任何人的上 即使在他的机器上,10次尝试中也只有2到3次 当执行顺序混乱时,我们查看了日志,B散列码的对象是相同的,线程id是相同的 因此,它在一个线程中,在一个对象上,执行顺序变得混乱 我在这里只显示伪代码,而不是实际的完整代码,因为即使使用真实代码,我也无法让它在其他机器上稳定地重现问题 这有什么原因吗?是否有任何隐藏的jvm秘密可能导致这种情况 我同事的机器上使用的jdk

预期的:3行m1对数,然后是3行m2对数

实际:有时m2日志会在m1日志之间打印

这只发生在我同事的机器的上,而不是其他任何人的

即使在他的机器上,10次尝试中也只有2到3次

当执行顺序混乱时,我们查看了日志,B散列码的对象是相同的,线程id是相同的

因此,它在一个线程中,在一个对象上,执行顺序变得混乱

我在这里只显示伪代码,而不是实际的完整代码,因为即使使用真实代码,我也无法让它在其他机器上稳定地重现问题

这有什么原因吗?是否有任何隐藏的jvm秘密可能导致这种情况

我同事的机器上使用的jdk是1.8.0131。这在我的机器上是一样的,但我的机器不能重现这个问题

2020-09-21更新

将堆栈跟踪信息添加到m2中的日志行中


它显示每次调用m2时,在堆栈跟踪中,它的调用者是调用ClassA中m1的行。请显示
log
方法。这可能是因为您使用了日志库吗?你知道它是否同步了吗?@AndyTurner它是log4j@cool我认为log4j从调用它的线程中获取线程id
//Pseudocode

class A
{
//......

b.method1();
b.method1();
b.method1();

b.method2();
b.method2();
b.method2();

//......
}

class B{
//......
method1(){
    log("m1 called {} {}",this.hashCode(),currentThreadId)
}

method2(){
    log("m2 called {} {}",this.hashCode(),currentThreadId)
}
//......
}