多线程有共同变量 initFlag,未使用volatile效果如下:
现象:线程1执行到while时,当前 initFlag = false,所以线程1进入死循环;线程2执行,调用 prepareData(),该方法中有将 initFlag重置为 true,线程2执行完,但从圈中部分可以看出程序仍在运行,线程1中的并没有跳出while的死循环(若跳出死循环则会打印出 success),可以看出线程1 使用的变量 initFlag 仍然是 = false的;结论是线程2变更initFlag的值,并没有共享到线程1中使用;
多线程有共同变量 initFlag,使用volatile效果如下:
现象:volatile使多线程共同使用的共享变量有可见性(一致性,共享变量变更后线程都会使用变更后的值);
底层实现解析:线程1,线程2 使用主内存中变量 initflag 时,都是 主内存–》工作内存–》cpu;线程1程序执行进入死循环 initFlag仍然是 false;线程2程序执行完后 initFlag变更为 true,则会将变更后主内存中 的 initFlag = true写到主内存中;共享变量 volatile 修饰,线程2在将从工作内存中马上将变更值更新到主内存中(马上表示的是在执行完 initFlag = true这行代码后马上进行更新变更值到主内存,而不是再等待后面其他程序逻辑执行完再操作,这样就不会造成变量一致性的延迟),工作内存将 initFlag =true存储到总线上,这时总线的缓存一致性协议与线程1的总线嗅探机制(监听)会在总线上监听到这个共享变量的变化,当线程1监听到 initFlag发生变化后会立马失效掉自己工作内存中的 initFlag = fasle,失效后线程1需要重新从 主内存中获取 initFlag,这时线程2是已经将 initFlag = true赋值到主内存中了,线程1重新取到的 initFlag则是 true了,所以会跳出 while的死循环执行 后续程序输出 ======success;