java多线程 可见性 原子性 有序性及问题所在

可见性:

我们的数据统一存储到我们的JMM的主内存当中。假如说同时有多个线程进来访问,那么我们多个线程并不是直接对主内存的数据进行修改
而是把各个数据拷贝到自己的工作内存当中,对其修改完再放回给主内存。这时并通知其他线程 这就是我们说的可见性。
JMM:java内存模型 一种抽象的内存模型 并不真实存在。
java多线程 可见性 原子性 有序性及问题所在

原子性:

如我们一个简单的n++的命令在底层字节码文件里其实是四个命令。如果加了volatile即使保证了我们的可见性。但是在线程t1在执行第7步的时候被挂起了,线程t2对值进行了修改,那么t1在拿到cpu调度权的一瞬间直接就把数据写入到了内存。不保证原子性就会出现写丢失的情况。所以我们在多线程的情况下一定要保证可见性,原子性
AtomicInteger atomicInteger = new AtomicInteger(); 这个是保证了原子性的一个Integer类型
java多线程 可见性 原子性 有序性及问题所在

有序性:

计算机在执行程序时,为了提高性能,会把我们写的程序的命令按照最优的方式把指令进行重排
源代码—>编译器优化的重排—>指令并行的重排—>内存系统的重排—>最终执行的命令。
但是重排时必须要考虑到指令之间的数据依赖性 所以我们在多线程环境下要避免指令进行重新排序 这就是有序性
java多线程 可见性 原子性 有序性及问题所在
我们的volatile实现了禁止指令重排的优化,从而避免了多线程环境下程序出现乱序的现象