https://mp.weixin.qq.com/s/f9PYMnpAgS1gAQYPDuCq-w

为什么程序员编写一个程序,会产生并发问题,如共享一个变量,多个线程操作到这个变量,导致数据不一致,这是个很大问题。

产生并发原因

现代计算机架构模式下,CPU从单核变成多核,提高了性能的同时,但通常我们程序运行过程中,有的做IO操作,有的是计算密集型任务,因此需要多个CPU核心,并行操作,这样将提高程序的运行效率;并且在java类文件编译后,会有如下的重排序过程:

编译器优化—》指令重排序—》内存数据重排序—》 最后到cpu具体执行

  1. 因此整个过程,会导致程序的代码,顺序会被打乱;导致顺序一致性的问题;
  2. 计算机的cpu和内存技术发展中,cpu的性能增长非常快,而内存存储技术比较慢,导致2者之间性能无法匹配,因此cpu每颗核心,增加了一级缓存,二级缓存等,也因此导致了从主存同cpu交换数据,出现数据不一致问题,或者cpu1核心操作一个变量后,无法及时从缓存中同步到主存,而线程cpu2需要获取这个变量,导致cpu1操作后对cpu2不可见,因此产生了可见性问题;
  3. 因为一系列的重排序,导致代码行运行,本身很多代码行天生不具备原子性(仅读取和赋值支持);因此导致原子性问题;