目录
一、可见性、原子性、有序性
可见性:
概念:(多个线程竞争)一个线程对共享变量的修改,其他线程立即得到修改后的最新值;
常见问题:在并发编程过程中,当一个线程对共享变量进行了修改,而其他线程并没有读取到该共享变量修改过后的值;
原子性:
概念:(多个线程竞争)原子性是指操作是不可分割的。若一条或多条指令具备原子性,那么这些指令要么全部执行且不会受其他因素干扰而中断,要么全都不执行。
常见问题:当一个线程对共享变量操作到一半时,另外的线程也有可能对共享变量进行操作,从而干扰了前一个线程的操作,影响最终结果。
有序性:
概念:(多个线程竞争)指程序中代码的执行顺序。Java会在编译和运行时对代码进行优化,导致程序最终的代码执行顺序可能不一定与我们所编写的代码执行顺序一致。
二、Java内存模型(JMM)
计算机结构:
缓存:
-
CPU中包含L1、L2、L3 三级缓存,L3为多个CPU核心共享的缓存;
-
序号越小,越接近CPU,速度越快,容量越小;
-
Cache(缓存)出现的目的是为了解决CPU直接访问内存效率低下的问题,程序在运行过程中,CPU接收到指令后,它会最先向CPU中的一级缓存(L1 Cache)寻找相关数据,若命中缓存,CPU进行计算时就可以直接对CPU Cache中的数据进行访问,当运算结束后,再讲CPU Cache中的最新数据刷新到主内存中,CPU通过直接访问Cache的方式替代直接访问主内存,极大地提高了CPU的吞吐能力。但由于一级缓存(L1 Cache)容量较小,所以不可能每次都命中。此时CPU就会继续向下层二级缓存(L2 Cache)寻找,同理若仍未找到,则会在第三层的L3 Cache(多核共享缓存中)、内存(主存)、硬盘中寻找。
Java内存模型:
概念:
-
Java内存模型(Java Memory Model),是Java虚拟机规范中所定义的一种模型,Java内存模型是标准化的,屏蔽掉了底层硬件以及不同的操作系统;
-
Java内存模型是一套规范,描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节:
-
主内存:所有线程共享的区域,各个线程均能够对其进行访问;所有的共享变量都存储于主内存中;
-
工作内存:每个线程都拥有一个自己的工作内存&
-