volatile
1)可见性。不能保证原子性。 2)禁止指令重排序。编译器,cpu,指令之间没有依赖关系的话,会将指令重新排序。 例如:Product p = new Product();这行代码分为以下3个步骤(伪代码)。
memory=allocate() 1.开内存空间 initialize(memory) 2.初始化 instance=memory 3.将instance指向memory内存地址,到这一步instance!=null 步骤2和步骤3没有依赖关系,会有指令重排。多线程下,单例模式需要注意这一点。
private static Product product; public static Product getInstance(){ if(product == null) product = new Product(); return product; }
javap 1)const,load。在class中,这两步是对栈顶进行改值的操作。没有这两步,栈顶的值没变,用的是之前的值。 这可以解释为什么i=i++为什么是0,i=++i则是1。详细如下。 https://blog.csdn.net/junsure2012/article/details/7099222 https://blog.csdn.net/luckyp/article/details/4255353 store是将栈顶的值给变量,例如下面最后两步 例如:
int i=10; i=i+3; int j=i;
bipush 10 istore_1 iload_1 iconst_3 iadd istore_1 iload_1 加载到栈顶 istore_2 给第2个变量 return
.....
|