首页 > 技术文章 > JAVA内存模型系列之简述

txba6868 2020-03-16 12:19 原文

        Java内存模型(java memory model)本身是一种抽象概念,是一种符合内存模型规范的,屏蔽了硬件和操作系统之间访问差异的,保证java程序在各种平台下对内存的访问都能达到一致性访问效果的规范及机制。目的是解决多线程通过共享内存进行通信时,存在的原子性,有序性,可见性问题。除此之外,java内存模型还提供一系列原语,封装底层后供开发者直接调用。比如我们常见的一些关键字如:synchronized,volatile,final以及并发包等。

       首先原子性问题:举例说明:多线程环境下,单一线程进行读改写操作,由于CPU具有时间片的概念,会根据不同调度算法进行线程调度,执行读改操作后,时间片耗尽,就会被迫中止操作。这种问题我们称为原子性问题,主要由CPU的指令重排导致。
       可见性问题:同样发生在多线程环境下,多个线程访问同一个共享内存,会将相关内存数据拷贝一份到自己的工作内存,并行操作,当一个线程修改了数据内容,其他线程无法看到新的值,就会导致可见性问题。
       有序性问题:一般指程序执行顺序不符合代码执行顺序,主要由JIT编译导致。
       原子性问题可以由synchronized解决,每次只允许一个线程进行操作。可见性可以用volatile关键字,将更新的数据强制性刷新到共享内存中,被其他线程看到。另外synchronized和final也可以解决可见性问题。有序性可通过volatile和synchronized解决,volatile可禁止指令重排,synchronized可保证同一时刻只有一个线程执行。

      

 

推荐阅读