Java 可见性

2020/12/8 笔记Java
  • volatile:Java虚拟机提供轻量级同步机制

    • 保证可见性

      JMM(Java内存模式):抽象的概念,并不存在,描述的是一种规则和规范。规范:可见性、原子性、有序性

      硬盘 < 内存 < CPU

      主内存就是共享内存,线程工作内存,工作内存修改其他工作内存也可以看见,传值需要通过主内存,不能直接工作内存写入另外一个工作内存。修改第一时间通知其他线程就是内存可见性。

    • 不保证原子性

      number++,分为把变量拷贝到工作内存,然后再操作,操作完拷贝到主内存。

    • 禁止指令重排序

      源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 -> 最终执行的指令

      单线程结果一致。多线程数据依赖性。

      Memory Barrier内存屏障(store指令,load指令),禁止指令重排序优化,强制刷出各种CPU的缓存数据

  • 单例模式

    DCL(Double check lock)

    public static SingletomDemo() {
    	if instance == null{
    		synchronized (SingleonDemo.class){
    			if (instance == null){
    				installce = new SingleonDemo();
    			}
    		}
    	}
    	return instance
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    问题:变为null,instance可能没有完成初始化