网上很多资料在描述Java内存模型的时候,都会介绍有一个主存,然后每个工作线程有自己的工作内存。原子性是指一个操作是不可中断的。随后两个线程进行后续+1操作,再赋值回去以后,i不是3,而是2。显然数据出现了不一致性。当然32位JVM读取32位整数是一个原子操作。在并发时,程序的执行可能就会出现乱序。比如上述代码,两个方法分别被两个线程调用。按照常理,写线程应该先执行a=1,再执行flag=true。是有可能会发生乱序,有可能不发生。这个要从cpu指令说起,Java中的代码被编译以后,最后也是转换成汇编码的。一条指令的执行是可以分为很多步骤的,假设cpu指令分为以下几步
暂无评论