可见性:

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

原子性:

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

有序性:

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

相关文章:

  • 2021-04-11
  • 2021-06-13
  • 2021-05-07
  • 2021-06-20
  • 2021-07-18
  • 2022-02-20
  • 2022-02-24
  • 2021-08-23
猜你喜欢
  • 2022-12-23
  • 2021-10-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-23
相关资源
相似解决方案