singleton变量使用volatile修饰.
volatile的作用及原理
当一个变量被volatile修饰时,会拥有两个特性:
保证了不同线程对该变量操作的内存可见性....因此,我们期望的结果是,上述Java代码执行1秒钟后停止,并且打印出1秒钟内计数器i的实际值。
然而,执行这个Java应用后,你发现它进入了死循环,程序没有停止....i = 1;//(1)
int j = 2;//(2)
int h = i * j;//(3)
上述代码中,(3)执行依赖于(1)(2)的执行,但是(1)(2)的执行顺序并不影响结果,也就是说当我们进行了上述的编码...但是在多线程中就会出现问题,比如下面的代码:
//线程1
context = loadContext();//(1)
inited = true;//(2)
//线程2
while(!...(2)语句,在线程2中,程序跳出了循环,执行doSomethingwithconfig,因为他认为context已经进行了初始化,然后并没有,就会出现错误.