/** * 因为我们的initialized被缓存了,普通变量是不具备内存可见性的, * 所以while循环读的initialized变量一直是缓存中的,而缓存中的值为false, * 也一直没有变过,程序也就一直在运行没有停下来。 */ public class Main { /** * 应用已经初始化 */ // private static boolean initialized = false; //这个是不具备内存可见性的,所以一直在 //循环当中,而这个就是内存可见性的重要原因 private static AtomicBoolean initialized = new AtomicBoolean(false); public static void main(String[] args) { //创建线程并且启动 new Thread() { @Override public void run() { while (!initialized.get()) { System.out.println("------------------------"); } } }.start(); //当前线程休息100s try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } //应用已经初始化 System.out.println("=============================="); initialized.set(true); }
注意以下几个问题:
1.AtomicBoolean类中记录value的值的类型是int而不是boolean
2.这里的底层指的是C语言,在C语言中是没有boolean类型的,用的是0或1来表示boolean类型,0表示false,1表示true,也就是说0表示假,非0表示真。与其说在调用底层的时候将Java中的value(true和false)转换为0或1还不如在一开始记录value的时候,就将value用int型来记录,这样就省去转换的步骤,而且避免了不必要的错误。
3.
AtomicBoolean类中的value具有内存可见性
AtomicBoolean类中的value是用volatile关键字所修饰的,所以它具有内存可见性: