java多线程的一个特别特别诡异的bug,请各位前辈帮忙看看。。

图片说明

程序大概是这个样子,A B类的功能是每隔一定的时间往控制台输出一下信息,并且A B类都有一个成员变量n用来记录输出了几次信息。 按理说等到某一个线程输出完8次信息后,程序应该终止,但是实际上这个程序确是一直执行下去的死循环。 更加诡异的是,如果把第14行的注释去掉,程序就会正确的结束。 一个System.out.pringtln()也会影响整个程序吗?

建议在if循环内加一个延时函数,进行调试

看一下java内存模型,线程间变量同步问题,需要volatile或者synchronized的,防止编译器优化并进行cpu总线加锁。