Android的JVM是Dalvik VM,不遵循Java虚拟机规范,是基于寄存器的架构,它的Java字节码被转化成基于寄存器的指令集,在Anroid 2.2版本引入JIT。
JIT:
方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。
一般来说,JIT编译器优化代码的时候会将这个线程没有修改到的非volatile类型的字段进行内联。一旦这个代码被编译了(你可以通过-XX:+PrintCompilation看到),你在另一个线程对这个字段进行的修改它很可能就永远也看不到了。加上随机的同步块或者打印语句可以推迟这个优化的执行,或者扰乱JIT编译器,让它不去执行这个优化。