面试 尚硅谷
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
.....
赞 (0)